MSSQL与UNIX时间戳

时间:2021-10-06 22:37:00

MSSQL与UNIX时间戳

http://hi.baidu.com/kcloze/item/4bc6dbdf61b5e257d63aaebf

 

MSSQL中UNIX时间的转换问题 --有的时候需要用到UNIX时间,该时间是指从'1970-01-01 00:00:00‘到当前的时间的秒数,在UNIX里这个叫时间戳,为了不和MSSQL的时间戳冲突(MSSQL的时间戳实际上是一个计数器)。这里就叫UNIX时间。另外下面的表达式也给出了精确到毫秒级单位的unix时间转换表达式

DECLARE @unixtime bigint

DECLARE @adate datetime

--下面的表达式的功能是将datetime类型的当前时间转换成从'1970-01-01 00:00:00‘到当前的时间的秒数
SET @unixtime = CONVERT(bigint,DATEDIFF(mi,'1970-01-01 00:00:00', GETDATE())) * 60 + DATEPART(ss,GETDATE())

--下面的表达式的功能是将从'1970-01-01 00:00:00‘到当前的时间的秒数转换成datetime类型
SET @adate = DATEADD (ss ,@unixtime % 60 ,DATEADD(mi,@unixtime / 60,'1970-01-01 00:00:00'))

SELECT @unxitime,@adate   

个人认为:select dateadd(ss,number,'1970-1-1 00:00:00') 不更好吗,

**********************************************

--下面的表达式的功能是将datetime类型的当前时间转换成从'1970-01-01 00:00:00‘到当前的时间的毫秒数
SET @unixtime = CONVERT(bigint,DATEDIFF(mi,'1970-01-01 00:00:00.000', GETDATE())) * 60000 + DATEPART(s,GETDATE()) * 1000 + DATEPART(ms, GETDATE())

--下面的表达式的功能是将从'1970-01-01 00:00:00‘到当前的时间的毫秒数转换成datetime类型
SET @adate = DATEADD (ms ,@unixtime % 60000 ,DATEADD(mi,@unixtime / 60000,'1970-01-01 00:00:00.000'))

SELECT @unxitime,@adate

 

*转载注:如果只用一个dateadd,则第二个参数容易报int溢出的错误。因为某些日期值超过int范围。如上的写法没问题。