gpt4 book ai didi

tsql - 将 unix 纪元时间戳转换为 TSQL 日期时间

转载 作者:行者123 更新时间:2023-12-04 11:20:48 27 4
gpt4 key购买 nike

我只找到了 one similar question但对于 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 long相当于 TSQL bigint - 他们都是 8 B长。重读 dateadd() documentation揭示了以下内容:

DATEADD (datepart , number , date )
....
number
Is an expression that can be resolved to an int that is added to a datepart of date. User-defined variables are valid.



如果我理解正确,这意味着这种方法不能用于将 unix 时间戳转换为 TSQL 时间戳,这就是原谅我的语言,但只是愚蠢。

我的问题是:
  • 我对这种情况的解释是否正确?
  • 还有其他的单线在 TSQL 中进行这种转换?

  • 聚苯乙烯
    修改日期参数 ( '1970-01-01 00:00:00.0' ) 作为解决方案是 Not Acceptable 。我正在调试,我不想重新计算毫秒数:)

    最佳答案

    很简单,先添加一整天,然后添加剩余的毫秒。一天有 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

    关于tsql - 将 unix 纪元时间戳转换为 TSQL 日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14507649/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com