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
)即可获得秒级的相同结果