之所以写这篇文章是因为我所做的项目是针对CS系统的BS版本(翻新)。CS系统是PowerBuilder开发的,数据库用的是sqlserevr,当我翻系统的时候我发现sqlserver和oracle的一些SQL中的函数并不能通用,而且还存在很多的差别。所以现在就把这些发现的差别列举出来。
日期
datediff
计算日期间隔
--sqlserver
select datediff(month,cast('2019-01-01' as datetime),cast('2019-01-31' as datetime))
--Oracle方法一
select ceil((to_date('2019-11-01','yyyy-mm-dd')-to_date('2020-01-31','yyyy-mm-dd'))/30) from dual
--oracle方法二
select to_char(to_date('2019-11-01','yyyy-mm-dd'),'mm')-to_char(to_date('2019-01-31','yyyy-mm-dd'),'mm') from dual
--oracle方法三
select ceil(months_between(to_date('2019-11-01','yyyy-mm-dd'),to_date('2020-01-31','yyyy-mm-dd'))) from dual
--需要注意的是,datediff中要得到正数结果,一般是用后面的月份减去前面
--推荐在oracle中使用第三种写法,Months_between是Oracle中提供的日期函数
--不要使用第一种方式,做数学运算,因为一个月中不一定是30天。
dateadd
日期加减
--sqlserver
select dateadd(month,2,getdate()); --加2个月
select dateadd(second,1,getdate()); --加1秒
--oracle
select add_months(sysdate,2) from dual; --加2个月
select sysdate,to_char(sysdate+1/24/60/60,'yyyy-mm-dd HH24:MI:SS') from dual; --加1秒
类型转换
convert
通常用来将时间转换为特定的格式字符串
CONVERT(VARCHAR(19),GETDATE())
CONVERT(VARCHAR(10),GETDATE(),110)
CONVERT(VARCHAR(11),GETDATE(),106)
CONVERT(VARCHAR(24),GETDATE(),113)
结果
Dec 29 2008 11:45 PM
12-29-2008
29 Dec 08
29 Dec 2008 16:25:46.635
使用oracle
to_char(sysdate,'yyyy-mm-dd')
to_date('2020-01-07','yyyy-mm-dd')
to_number('000012134')
专门介绍一下to_number
(1)to_number(varchar2 or char,'格式')
select to_number('000012134') from dual;
select to_number('88877') from dual;
(2)如果数字在格式范围内的话,就是正确的,否则就是错误的;如:
select to_number('$12345.678', '$999999.99') from dual;
select to_number('$12345.678', '$999999.999') from dual;
(3)可以用来实现进制转换;16进制转换为10进制:
select to_number('19f','xxx') from dual;
select to_number('f','xx') from dual;
cast
通常用来将字符串转换为时间
select cast(date as signed) as date from table1;
select cast(date as char) as date from table1;
select cast(date as datetime) as date from table1;
select cast(date as date) as date from table1;
select cast(date as time) as date from table1;
其他
abs
绝对值函数,这个函数是一样的
select abs(-1) from dual
top n
取前几条记录
--sqlserver
select top 1 name from table
--oracle
select name from table where rownum=1 order by time desc
ceiling
向上取整
--sqlserver
select ceiling(-1.001)
--oracle
select ceil(-1.001) from dual
floor
向下取整
--sqlserver
select floor(-1.001) value
--oracle
select floor(-1.001) value from dual
未完待续…