Oracle转mysql的一些函数替换

近期公司项目中需要把Oracle数据迁移到mysql中,所以一些写的sql不能通用,需要进行函数替换。

以下就是自己整理的一些sql中Oracle转mysql的替换,目前只整理了一部分,希望对大家有用

1、日期的替换

Oracle中通常采用的日期函数是SYSDATE,SYSTIMESTAMP(毫秒级)

mysql中需要替换为SYSDATE(),一定要注意mysql需要加()

sql通常也会使用字符串转date,或者date转字符串的情况

(1)时间转字符串

Oracle中可以使用to_char()函数 例如to_char(sysdate, 'yyyy-mm-dd')

mysql中需要使用DATE_FORMAT()函数例如DATE_FORMAT(sysdate(), '%Y-%m-%d')

注意:Oracle和mysql的时间格式是不一样的

(2)字符串转时间

Oracle中可以使用to_date()函数,例如to_date('2022-02-16 18:29:18','yyyy-mm-dd hh24:mi:ss')

mysql中需要使用str_to_date()函数,例如str_to_date('2022-02-16 18:29:18','%Y-%m-%d %H:%i:%s')

2、时间的加减

Oracle中对时间进行计算天数的时候可以使用TRUNC()函数截取

使用方式可以参考Oracle trunc()函数的用法 - Felix-Zhang - 博客园

对月份进行加减,add_months()函数 例如add_months(SYSDATE, -3) 获取前3个月的时间

mysql中对时间进行加减的话使用date_sub()函数  

DATE_SUB(date,INTERVAL expr type) date 参数是合法的日期表达式。expr 参数是您希望添加的时间间隔 ,type 就是时间类型,比如天day,月month等等

date_sub函数可以对天,月,年,周。。。都可以进行操作

例如date_sub(CURDATE(),interval 6 day) 往前获取前6天

date_sub(SYSDATE(),interval 3 month)  往前获取前3个月,往后获取的话改为-3即可。

注意:Oracle中sysdate-1是对天数操作,mysql中sysdate()-1不是对天数操作的(知道的可以麻烦告知下,感谢)

3、sql对数据进行增加分隔符

ORacle根据某字段进行排序后把结果集进行增加分隔符

listagg('需要进行增加分隔符的字段', ',') within group (order by '字段' DESC)

mysql中

group_concat('需要进行增加分隔符的字段' order by '字段'  DESC separator ',' )

4、常用的模糊查询

oracle

LIKE '%' || TRIM('syst') || '%' 

mysql

Like concat('%',concat(TRIM('syst')),'%')  concat是对字符串进行拼接

5、逻辑判断

Oracle

decode(fis.STATUS, '01', '正常', '02', '冻结')   status=01返回正常,否则返回冻结

mysql

(case when fis.STATUS = '01'then'正常'when '02'then'冻结' end) 

6、毫秒

Oracle

SYSTIMESTAMP函数即可

mysql

STR_TO_DATE(DATE_FORMAT(SYSDATE(),'%Y-%m-%d %H:%i:%s.%f'),'%Y-%m-%d %H:%i:%s.%f')

mysql转出来后毫秒为.000

7、在用in函数时,操作字符串,不是数组

Oracle

SELECT REGEXP_SUBSTR('50,55,57,43', '[^,]+', 1, ROWNUM) FROM DUAL CONNECT BY ROWNUM <=  LENGTH('50,55,57,43') - LENGTH(REGEXP_REPLACE('50,55,57,43', ',' , '')) + 1

可以将字符串通过','分隔成数组

mysql

select * from tablename where find_in_set(查询的字段,'50,55,56')

使用find_in_set函数,最终查询结果一样的,如果直接使用in(字符串),他只会返回查询字段=50的数据,后面两个不进行操作,可自行实践下。

注意:mysql中使用find_in_set函数时,字符串是','分隔才会有效

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值