sql - T SQL 将 Unix 刻度转换为日期时间

标签 sql t-sql datetime type-conversion unix-timestamp

让我们考虑这个 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)

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

我期望类似 00:34:30:762

我设法使用 c# .Net 进行操作,但现在我需要使用 TSQL 进行操作。

最佳答案

我会将刻度总数分解为完整的天、小时、分钟、秒和毫秒,然后对每个日期部分执行 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' 之前的任何日期值,因此希望能满足您的需求!

关于sql - T SQL 将 Unix 刻度转换为日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35511168/

相关文章:

php - 将下拉菜单中的值分配给 Controller 中的变量,该变量在 Codeigniter 的模型中使用

sql - 获取两个日期之间每个月的开始和结束时间

c# - 格式化日期时间时区

datetime - 在 Julia 中解析祖鲁语日期会引发 InexactError

mysql - 使用存储过程查找学期

php - 使用 SQL 的投票/排名逻辑

sql - 同一查询中的顶部和底部?

sql - AdventureWorks 数据库和 dbo 前缀

验证时间输入的 Pythonic 方法(仅适用于 Hr、Min、Sec)

mysql - 如何使用 ID 从 Sqlite 中删除一行,其中我的 ID 是二进制数据 (GUID)