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