我正在處理以微秒為單位包含 [duration] 的資料,一些示例:
5982312624, 181240328664, 2981750461, 993806305107, 3015857413, 283850264906, 5987597545, 24058730
我將其轉換為小時數、分鐘數和秒數,如下所示:
(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。
希望任何人都可以提供幫助。提前致謝。
uj5u.com熱心網友回復:
假設 aduration不能超過 100 天,如果你記錄microseconds,我希望它不能超過 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 | 期間 | 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 | 期間 | 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 | 期間 | 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 的例子
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/339055.html
標籤:sql sql-server 时间 期间
