我只发现了一个类似的问题 ,但为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'
)不为接受的解决方案。 我调试,我不想重新计算沿着:)的毫秒