【问题标题】:Convert seconds to HH:MM:SS with hours more than 24将秒数转换为 HH:MM:SS 小时数超过 24
【发布时间】:2021-05-12 09:25:52
【问题描述】:

我想将 97200 秒转换为 HH:MM:SS 格式。我使用了以下 SQL Server 语法,但只要小时数少于 24 小时,它就可以工作

select convert(varchar,dateadd(s,round(convert(double precision,round(97200,2)),2),0),114)

它给出 03:00:00:000

但我希望看到 27:00:00

【问题讨论】:

标签: sql-server sql-server-2005 sql-server-2012


【解决方案1】:

在 SQL Server 中,尝试以下操作:

WITH tmp_table AS (
    SELECT '2022-02-01 01:00:00' AS StartTime, '2022-02-01 01:31:31' AS EndTime
    UNION ALL 
    SELECT '2022-02-01 02:00:00' AS StartTime, '2022-02-01 04:00:00' AS EndTime
    UNION ALL
    SELECT '2022-02-01 02:00:00' AS StartTime, '2022-02-02 16:00:00' AS EndTime
    UNION ALL 
    SELECT '2022-02-01 02:00:00' AS StartTime, '2022-02-02 01:59:59' AS EndTime
) 

SELECT 
    StartTime,
    EndTime,
    CONCAT(REPLACE(STR(CAST(DATEDIFF(SECOND,StartTime,EndTime) / 3600 AS VARCHAR(2)), 2), SPACE(1), '0') ,RIGHT(CAST(CONVERT(varchar, DATEADD(ms, DATEDIFF(SECOND,StartTime,EndTime) * 1000, 0), 108) AS VARCHAR(8)),6)) AS "HH:MM:SS Format"
FROM tmp_table;

结果:

StartTime               EndTime               HH:MM:SS Format 
2022-02-01  01:00:00    2022-02-01 01:31:31   00:31:31
2022-02-01  02:00:00    2022-02-01 04:00:00   02:00:00
2022-02-01  02:00:00    2022-02-02 16:00:00   38:00:00
2022-02-01  02:00:00    2022-02-02 01:59:59   23:59:59

第 1 步: 获取小时数并以字符串形式返回。我们还用 '0' 填充最多 2 个空格,这将返回格式为 (HH)

REPLACE(STR(CAST(DATEDIFF(SECOND,StartTime,EndTime) / 3600 AS VARCHAR(2)), 2), SPACE(1), '0')

第 2 步: 代码的以下部分通过删除小时返回 (:MM:SS)(如果持续时间超过 24 小时,则可以重置为 0)。这是作为字符串返回的

RIGHT(CAST(CONVERT(varchar, DATEADD(ms, DATEDIFF(SECOND,StartTime,EndTime) * 1000, 0), 108) AS VARCHAR(8)),6)

第 3 步:将 2 个字符串连接在一起得到 HH:MM:SS

CONCAT(REPLACE(STR(CAST(DATEDIFF(SECOND,StartTime,EndTime) / 3600 AS VARCHAR(2)), 2), SPACE(1), '0') ,RIGHT(CAST(CONVERT(varchar, DATEADD(ms, DATEDIFF(SECOND,StartTime,EndTime) * 1000, 0), 108) AS VARCHAR(8)),6))

【讨论】:

    【解决方案2】:

    你能试试这个查询吗?

    DECLARE @RefDate DATETIME = CONVERT(datetime, '01.01.1900',104);
    DECLARE @Seconds int = 97200;
    DECLARE @CompareDate datetime = DATEADD(second, 97200, @RefDate);
    
    SELECT @Seconds,
           CAST(DATEDIFF(HOUR, @RefDate, @CompareDate) AS varchar(100))
           + ':'
           + CAST(DATEPART(MINUTE, @CompareDate) AS varchar(2))
           + ':'
           + CAST(DATEPART(SECOND, @CompareDate) AS varchar(2))
    

    【讨论】:

      【解决方案3】:

      …从总秒数中计算小时、分钟、秒,并将它们连接到 hh:mm:ss 中

      declare @sec int=97200; --123426
      --in case hours >=100
      select concat(right(concat(0, @sec/3600), isnull(nullif(len(@sec/3600),1), 2)), ':', right(concat(0, @sec%3600/60),2), ':', right(concat(0, @sec%60),2))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多