sqlserver常用函数和oracle对比

之所以写这篇文章是因为我所做的项目是针对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 

未完待续

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值