SQL:将持续时间(以微秒为单位)转换为 DD:HH:MM:SS

SQL: Convert duration in microseconds to DD:HH:MM:SS

我正在处理包含以微秒为单位的 [duration] 的数据,一些示例:

5982312624, 181240328664, 2981750461, 993806305107, 3015857413, 283850264906, 5987597545, 240770859583

我将其转换为小时、分钟和秒数,如下所示:

(CONVERT(VARCHAR(10), Dateadd(second, (((([duration]/10^7)/3600*60)/1000000.0)*60),0),114)) AS [HH:MM:SS]

我面临的问题是当它超过 24 小时时它没有正确注册。

问题:我想在这里添加一天,例如:DD:HH:MM:SS -> 01:23:04:33,或者只是继续计算小时数,例如:45:12:52.

希望有人能提供帮助。提前致谢。

假设 duration 不能超过 100 天,如果你正在记录 微秒 ,我希望它不能超过 100 天,然后给出这个样本数据:

CREATE TABLE dbo.Source(id int identity, duration bigint);

INSERT dbo.Source(duration) VALUES
(5982312624),(181240328664),(2981750461),(993806305107),
(3015857413),(283850264906),(5987597545),(240770859583);

一种方法是在向任意 1 月 1 日添加秒(不是微秒,这会溢出)之后确定一年中的第几天,并将天数添加到时间转换中:

SELECT id, duration, 
  [DD:HH:MM:SS] = RIGHT('0' + RTRIM(DATEPART(DAYOFYEAR, dt) - 1), 2)
    + ':' + CONVERT(char(8), dt, 108)
  FROM dbo.Source 
  CROSS APPLY 
  (
    VALUES(DATEADD(SECOND, duration/1000000.0, '20000101'))
  ) AS d(dt);

结果:

id duration DD:HH:MM:SS
1 5982312624 00:01:39:42
2 181240328664 02:02:20:40
3 2981750461 00:00:49:41
4 993806305107 11:12:03:26
5 3015857413 00:00:50:15
6 283850264906 03:06:50:50
7 5987597545 00:01:39:47
8 240770859583 02:18:52:50

如果能超过100天(或一年以上),可以做这个小改动:

SELECT id, duration, 
  [DDDD:HH:MM:SS] = RIGHT('000' + RTRIM(DATEDIFF(DAY, '20000101', dt)), 4)
    + ':' + CONVERT(char(8), dt, 108)
  FROM dbo.Source 
  CROSS APPLY 
  (
    VALUES(DATEADD(SECOND, duration/1000000.0, '20000101'))
  ) AS d(dt);

结果:

id duration DDDD:HH:MM:SS
1 5982312624 0000:01:39:42
2 181240328664 0002:02:20:40
3 2981750461 0000:00:49:41
4 993806305107 0011:12:03:26
5 3015857413 0000:00:50:15
6 283850264906 0003:06:50:50
7 5987597545 0000:01:39:47
8 240770859583 0002:18:52:50

为了完整起见,如果您希望将所有小时数加在一起而不是分开几天,实际上会稍微更多复杂:

SELECT id, duration, 
    [HHHH:MM:SS] = RIGHT('000' + CONVERT(varchar(11), 
      24 * DATEDIFF(DAY, '20000101', dt) + DATEPART(HOUR, dt)), 4)
      + RIGHT(CONVERT(char(8), dt, 108), 6)
  FROM dbo.Source 
  CROSS APPLY 
  (
    VALUES(DATEADD(SECOND, duration/1000000.0, '20000101'))
  ) AS d(dt);

结果:

id duration HHHH:MM:SS
1 5982312624 0001:39:42
2 181240328664 0050:20:40
3 2981750461 0000:49:41
4 993806305107 0276:03:26
5 3015857413 0000:50:15
6 283850264906 0078:50:50
7 5987597545 0001:39:47
8 240770859583 0066:52:50

如果可以超过 1,000 天,那么,也许您应该考虑将开始和结束存储为日期时间而不是持续时间(以微秒为单位)。