【问题标题】:SQL: Convert duration in microseconds to DD:HH:MM:SSSQL:以微秒为单位将持续时间转换为 DD:HH:MM:SS
【发布时间】:2021-12-12 17:37:15
【问题描述】:

我正在处理包含 [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。

希望任何人都可以提供帮助。提前致谢。

【问题讨论】:

标签: sql sql-server time duration


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多