更新时间:2020年8月4日11:57:59
Mybatis
- VARCHAR2 改成VARCHAR
- mybatis中sql语句最后不能加分号 ,mysql解决方式在数据库url后添加
allowMultiQueries=true
;oracle尚未测试 - 转义字符 :XML sql中不能直接使用大于小于符号,需要使用转义符替代
转义符 | 实际 | 表达 |
---|---|---|
< | < | 小于 |
> | > | 大于 |
时间函数
参考:SQL Date 函数
https://www.w3school.com.cn/sql/sql_dates.asp
注:1.mysql中date_format返回值是字符串,date返回值是日期;
2.Oracle中to_char返回值是字符串,trunc返回值是日期;
3.Oracle中日期与字符串无法直接比较,需要转换成相同类型。
Oracle
增减一小时 | sysdate±1/24 |
增减一天 | sysdate±1 |
增减一月 | add_months(sysdate, ±1) |
增减一季度 | add_months(sysdate, ±3) |
增减一年 | add_months(sysdate, ±12) |
MySQL
date_sub: 对指定时间减少指定间隔
date_add: 对指定时间增加指定间隔
增减一小时 | date_sub(sysdate(), interval 1 hour) | date_add(sysdate(), interval -1 hour) |
增减一天 | date_sub(sysdate(), interval 1 day) | date_sub(sysdate(), interval -1 day) |
增减一月 | date_sub(sysdate(), interval 1 month) | date_sub(sysdate(), interval -1 month) |
增减一季度 | date_sub(sysdate(), interval 3 month) | date_sub(sysdate(), interval -3 month) |
增减一年 | date_sub(sysdate(), interval 1 year) | date_sub(sysdate(), interval -1 year) |
注:示例中均为减少操作
别名
Mysql中group by可以使用别名,Oracle 中不可以
select to_char(fatc.TRADE_DATE,‘YYYY-MM-DD’) AS tradeTime from FSBP_ACCEPTBIZ_TRADE_COLLECT fatc GROUP BY tradeTime | MYSQL中没有问题 |
select to_char(fatc.TRADE_DATE,‘YYYY-MM-DD’) AS tradeTime from FSBP_ACCEPTBIZ_TRADE_COLLECT fatc GROUP BY to_char(fatc.TRADE_DATE,'YYYY-MM-DD') | Oracle中直接使用别名会报错 |
select * from (select to_char(fatc.TRADE_DATE,'YYYY-MM-DD') AS tradeTime from FSBP_ACCEPTBIZ_TRADE_COLLECT fatc ) GROUP BY tradeTime | 或者可以在Oracle中使用嵌套查询 |
聚合函数+分组
Oracle中出现在select列表中的字段或者出现在order by后面的字段,如果不是包含在分组函数中,那么该字段必须同时在group by子句中出现。
Mysql没有此限制。
参考:sql 聚合函数和group by 联合使用
https://www.cnblogs.com/panchanggui/p/10652852.html
空值判断
MySQL中IFNULL函数在Oracle中可以使用NVL函数替代
MYSQL
IFNULL(v1,v2)如果v1的值不为NULL,则返回v1,否则返回v2。
NULLIF(expr1,expr2) 比较两个字符串,如果字符串expr1与expr2相等返回NULL,否则返回expr1
ORACLE
NULLIF(expression1,expression2) 如果两个表达式不相等,NULLIF返回第一个expression1的值。如果两个表达式相等,NULLIF返回空值NULL。
NVL(eExpression1,eExpression2) 如果eExpression1的计算结果为null值,则NVL()返回eExpression2。如果eExpression1的计算结果不是null值,则返回eExpression1。
NULL和空字符串
Oracle(null等同于空字符’’)
1.oracle插入空字符串默认替换成null
2.oracle查询(null和被替换的空字符)时使用 is null/is not null
3.使用聚合函数时自动忽略null值
Mysql(null不等同于空字符’’)
1.mysql插入null显示为null,插入空字符串显示空
2.null查询用 is null/is not null,空字符’‘查询用 =’’/<>’’
3.使用聚合函数时自动忽略null值
分页查询
MySQL关键字limit
Oracle:
①:普通分页,三层嵌套查询
②:需要有order by语句
③:只查询第一条数据时使用
模糊查询
MySQL中
concat(’%’,#{参数},’%’)
在Oracle中用
’%’||#{参数}||’%’
替代
转义符 `
` 是 MySQL 的转义符,避免和 mysql 的本身的关键字冲突
STATUS是MYSQL的关键字,在ORACLE中不是,直接去掉`
IF函数
在mysql中if()函数的用法类似于java中的三目表达式,其用处也比较多,具体语法如下:
IF(expr1,expr2,expr3),如果expr1的值为true,则返回expr2的值,如果expr1的值为false,则返回expr3的值。
在ORACLE中可以使用DECODE函数替代
IF | update COMPARE_HISTORY_TGT a ,mod_rcl_compare_data_tgt b set a.COMPARE_STATUS = b.STATUS,a.QUESTION_TYPE = IF (b.STATUS=‘T’,‘02’,a.QUESTION_TYPE) where a.PAYCOMPANY_ORDER_SEQNO = b.ORG_SEQ |
DECODE | update COMPARE_HISTORY_TGT a ,mod_rcl_compare_data_tgt b set a.COMPARE_STATUS = b.STATUS,a.QUESTION_TYPE = DECODE (b.STATUS,‘T’,‘02’,a.QUESTION_TYPE) where a.PAYCOMPANY_ORDER_SEQNO = b.ORG_SEQ |
时间函数
to_days
mysql中所用to_days进行两个日期的相差天数,
Oracle中可以参考使用trunc函数:
trunc(sysdate,'dd')-trunc(sysdate-2,'dd')
year、month、day、quarter
year年、month月、day日
MONTH函数返回一个整数,表示指定日期值的月份,其余同理。
在Oracle中:
参考:
SELECT extract(month from sysdate) FROM dual
或
SELECT to_char(sysdate,'MM') FROM dual
注(这种方式返回类型为字符串,如08,如需使用数字类型需要to_number(to_char(sysdate,'MM')))
quarter季度
select to_char(sysdate,'Q') from dual
1、//oracle中extract()函数从oracle 9i中引入,用于从一个date或者interval类型中截取到特定的部分
- select extract(year from sysdate) from dual; --当前年
- select extract(month from sysdate) from dual; --本年到当月的月数
- select extract(day from sysdate) from dual; --本月到当日的天数
- select extract(year from date’2011-05-17’) year from dual;
- select extract(month from date’2011-05-17’) month from dual;
- select extract(day from date’2011-05-17’) day from dual;
2、ORACLE里获取一个时间的年、季、月、周、日的函数
- select to_char(sysdate, ‘yyyy’ ) from dual; --年
- select to_char(sysdate, ‘MM’ ) from dual; --月
- select to_char(sysdate, ‘dd’ ) from dual; --日
- select to_char(sysdate,‘Q’) from dual; --季
- select to_char(sysdate,‘iw’) from dual; --周–按日历上的那种,每年有52或者53周
- 当前时间减去7分钟的时间
select sysdate,sysdate - interval '7' MINUTE from dual;
- 当前时间减去7小时的时间
select sysdate - interval '7' hour from dual;
- 当前时间减去7天的时间
select sysdate - interval '7' day from dual;
- 当前时间减去7月的时间
select sysdate,sysdate - interval '7' month from dual;
- 当前时间减去7年的时间
select sysdate,sysdate - interval '7' year from dual;
- 时间间隔乘以一个数字
select sysdate,sysdate - 8*interval '7' hour from dual;
AS关键字
在Oracle里,表的别名不能用as,列的别名可以用as