假设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 |
如果它可以超过 1000 天,那么,也许您应该考虑将开始和结束存储为日期时间,而不是以微秒为单位的持续时间。