【问题标题】:T SQL Convert Unix Ticks to DateTimeT SQL 将 Unix 刻度转换为日期时间
【发布时间】:2016-06-01 08:56:05
【问题描述】:

让我们考虑一下这个 BigInt:

duration = 20732867458

我可以把它转换成这样的分钟数:

Select CONVERT(varchar, DATEADD(mi,duration/600000000,0),114) as DurationInHours... `

这给了我 00:34:00:000

我按照这个建议除以6亿: Convert UNIX timestamp to .NET DateTime ticks in unmanaged code (without using .NET)

尽管如此,上述方法不会返回准确的秒和毫秒值。如果我将浮动持续时间除以 6 亿,则持续时间为 34.55 分钟。

我希望像 00:34:30:762 这样的时间

我设法用 c# .Net 做,但现在我需要用 TSQL 做。

【问题讨论】:

  • @MaxU 我已经尝试过这个函数,但是对于我表中的很多 bigint 值,我收到以下错误:“将表达式转换为数据类型 int 的算术溢出错误”
  • 我已经尝试将 bigint 20732867458 从您的示例中转换为 epochconverter.com 的日期时间。这给了我GMT: Sun, 31 Dec 2626 17:50:58 GMT... 看不到 34 分钟。我做错了什么?
  • gofr1,原因是 epochconverter.com 的转换器基于纪元以来的秒数,而不是纪元以来的滴答数。由于每秒有 10,000,000 个滴答声,您只需输入 2073(即20732867458 / 10000000)即可获得相同的结果,以秒为单位

标签: sql tsql datetime type-conversion unix-timestamp


【解决方案1】:

我会将滴答的总数分解为完整的天数、小时数、分钟数、秒数和毫秒数,然后为每个日期部分执行 DATEADD 以构建要返回的最终日期时间值。

例如,如果每秒有 10,000,000 次滴答,则 UNIX 时间戳 14767117605430000 等效于 '2016-10-17 13:42:40.543',因此我将在 T-SQL 中按如下方式计算:

    -- ticks per millisecond =       10,000
    -- ticks per second =        10,000,000
    -- ticks per minute =       600,000,000
    -- ticks per hour =      36,000,000,000
    -- ticks per day =      864,000,000,000

    DECLARE @Datetime BIGINT
    SET @Datetime = 14767117605430000

    DECLARE @Days INT
    DECLARE @Hours INT
    DECLARE @Minutes INT
    DECLARE @Seconds INT
    DECLARE @Milliseconds INT

    SET @Days = @Datetime / 864000000000
    SET @Hours = (@Datetime - (CONVERT(BIGINT,@Days) * 864000000000)) / 36000000000
    SET @Minutes = (@Datetime - (CONVERT(BIGINT,@Days) * 864000000000) - (CONVERT(BIGINT,@Hours) * 36000000000))/ 600000000
    SET @Seconds = (@Datetime - (CONVERT(BIGINT,@Days) * 864000000000) - (CONVERT(BIGINT,@Hours) * 36000000000) - (CONVERT(BIGINT,@Minutes) * 600000000)) / 10000000
    SET @Milliseconds = (@Datetime - (CONVERT(BIGINT,@Days) * 864000000000) - (CONVERT(BIGINT,@Hours) * 36000000000) - (CONVERT(BIGINT,@Minutes) * 600000000) - (CONVERT(BIGINT,@Seconds) * 10000000)) / 10000

    SELECT DATEADD(MILLISECOND, @Milliseconds, DATEADD(SECOND, @Seconds, DATEADD(MINUTE, @Minutes, DATEADD(HOUR, @Hours, DATEADD(DAY, @Days, '1970-01-01')))))

您显然可以根据需要更改@Datetime 的初始值,也可以根据需要将此代码包装到函数或存储过程中。

这适用于不超过'9999-12-31 23:59:59.999' 的任何日期值,因此希望能满足您的需求!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多