我发现只有一个类似的MySQL问题。 我在开发网络服务时不得不查询数据库(MS SQL server)。由于我无法获得正确的结果,所以决定通过SQL客户端测试查询。Web服务使用Hibernate访问数据库,并且所有时间值始终表示为长整型值(Unix纪元时间)。为了测试它,我需要将Unix时间戳转换为TSQL时间戳。这就是我想出来的方法:
我确保 java long 等同于 TSQL bigint - 它们都是
我的问题是:
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 long 等同于 TSQL bigint - 它们都是
8 B
长。重新阅读 dateadd() documentation 后发现以下内容:
如果我理解正确,这意味着这种方法不能用于将 Unix 时间戳转换为 TSQL 时间戳,这很愚蠢。DATEADD (datepart , number , date )
....
number
是一个表达式,可以解析为 int,并添加到日期的 datepart 中。用户定义的变量是有效的。
我的问题是:
- 我对这种情况的解释正确吗?
- 是否有其他一行代码可以在 TSQL 中完成此转换?
PS
修改日期参数('1970-01-01 00:00:00.0'
)不是可接受的解决方案。我正在调试,不想重新计算毫秒数 :)