转换Unix纪元时间戳TSQL日期时间(Convert unix epoch timestamp t

2019-07-18 16:00发布

我只发现了一个类似的问题 ,但为MySQL。

我工作的一个Web服务,并且必须查询数据库(MS SQL服务器)。 因为我无法得到正确的结果,我决定通过SQL客户端来测试查询。 Web服务使用Hibernate来访问数据库和所有的时间值始终表示为长值(Unix纪元时间)。 为了测试它,我需要Unix的时间戳TSQL时间戳转换。 这是我想出了:

select dateadd(ms,123,'1970-01-01 00:00:00.0');

其输出:

1970-01-01 00:00:00.123

但是,我的实际数据是有点大

select dateadd(ms,1359016610667 ,'1970-01-01 00:00:00.0');

其输出:

Error code 0, SQL state 22001: Data truncation
Error code 8115, SQL state 22003: Arithmetic overflow error converting expression to data type int.

所以,我想:

select dateadd(ms,CAST (1359016610667 AS BIGINT) ,'1970-01-01 00:00:00.0');

其输出完全相同的错误。 为了安全起见我想:

select CAST (1359016610667 AS BIGINT) 

其输出:

1359016610667

我确信, Java的长相当于TSQL BIGINT -他们都是8 B长。 李自成DATEADD()文档显示以下内容:

DATEADD(日期部分,数字,日期)
....

是可以解决的,以被添加到日期的日期部分int类型的表达式。 用户定义的变量是有效的。

如果我理解正确这,这意味着这种方法不能用于转换unix时间戳到TSQL时间戳,这是,嗯,原谅我的语言,但只是普通的迟钝。

我的问题是:

  • 我这种情况的解释是否正确?
  • 是否有任何其他的单行做在TSQL这种转换?

PS
修改日期参数( '1970-01-01 00:00:00.0' )不为接受的解决方案。 我调试,我不想重新计算沿着:)的毫秒

Answer 1:

很简单,首先添加整天,再加入剩余的毫秒。 有86,400,000毫秒一天。

declare @unixTS bigint
set @unixTS = 1359016610667


select dateadd(ms, @unixTS%(3600*24*1000), 
    dateadd(day, @unixTS/(3600*24*1000), '1970-01-01 00:00:00.0')
)

其结果是2013-01-24 08:36:50.667



Answer 2:

这应该非常适合那些长期大纪元。

SELECT DATEADD(SECOND, 1359016610667 / 1000, '19700101 00:00')


文章来源: Convert unix epoch timestamp to TSQL datetime