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 天,那么,也许您应该考虑将开始和结束存储为日期时间而不是持续时间(以微秒为单位)。
- 示例位于 db<>fiddle
我正在处理包含以微秒为单位的 [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 天,那么,也许您应该考虑将开始和结束存储为日期时间而不是持续时间(以微秒为单位)。
- 示例位于 db<>fiddle