T SQL将Unix标记转换为日期时间 让我们考虑这个大数: duration = 20732867458

T SQL将Unix标记转换为日期时间 让我们考虑这个大数: duration = 20732867458,sql,tsql,datetime,type-conversion,unix-timestamp,Sql,Tsql,Datetime,Type Conversion,Unix Timestamp,我可以将其转换为如下所示的分钟数: Select CONVERT(varchar, DATEADD(mi,duration/600000000,0),114) as DurationInHours... ` 这是00:34:00:000 根据这个建议,我除以6亿: 但是,上述方法不会返回秒和毫秒的准确值。如果我将持续时间除以6亿,则持续时间为34,55分钟 我想大概是00:34:30:762 我设法在c#.Net中实现,但现在我需要在TSQL中实现。我会将总的滴答数分解为完整的天、小时、分钟

我可以将其转换为如下所示的分钟数:

Select CONVERT(varchar, DATEADD(mi,duration/600000000,0),114) as DurationInHours... `
这是00:34:00:000

根据这个建议,我除以6亿:

但是,上述方法不会返回秒和毫秒的准确值。如果我将持续时间除以6亿,则持续时间为34,55分钟

我想大概是00:34:30:762


我设法在c#.Net中实现,但现在我需要在TSQL中实现。

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

例如,如果每秒有10000000个滴答声,UNIX时间戳
1476711760540000
相当于
'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',希望能满足您的需要

检查此项:@MaxU我已经尝试了此函数,但是对于我表中的许多bigint值,我得到了以下错误:“算术溢出错误将表达式转换为数据类型int”我已尝试从您的示例中转换bigint
20732867458
,在datetime上。这给了我
GMT:Sun,2626年12月31日17:50:58 GMT
。。。我看不见34分钟。我做错了什么?原因是epochconverter.com上的转换器是基于从纪元开始的秒数,而不是从纪元开始的滴答声。由于每秒有10000000个滴答声,您只需输入
2073
(即
20732867458/10000000
)即可获得秒级的相同结果