首页 > 解决方案 > 如何以小时、分钟和秒为单位解析 SQL Server 字符串

问题描述

我将时间存储为PT1H22M59.551S.
那里的读数为 1 小时 22 分 59.551 秒。

分割这个最有效的方法是什么?

数据可能是这样的。所以没有分隔符是强制性的

PT0S
PT6H4M29.212S
PT0S
PT2M55.126S
PT54M4.12S
PT3H6M5.74S
PT16H27M52.069S

标签: sqlsql-serverstringdateparsing

解决方案


您还可以创建一个函数来执行带有基本文本操作的转换:

CREATE FUNCTION dbo.f_GetTime(@TimeInput VARCHAR(50)) RETURNS TIME
AS BEGIN
    SET @TimeInput = REPLACE(REPLACE(@TimeInput, 'PT', ''), 'S', '')
    IF CHARINDEX('H', @TimeInput) = 0 -- Add missing H
        SET @TimeInput = '0H' + @TimeInput
    IF CHARINDEX('M', @TimeInput) = 0 -- Add missing M
        SET @TimeInput = REPLACE(@TimeInput, 'H', 'H0M')
    RETURN CONVERT(TIME, REPLACE(REPLACE(@TimeInput, 'H', ':'), 'M', ':'))
END
GO

然后您可以将它与标量查询一起使用:

SELECT dbo.f_GetTime('PT1H22M59.551S') AS TimeValue

或者您可以将它与表格一起使用:

DECLARE @Input TABLE (TimeInput VARCHAR(20))
INSERT @Input VALUES ('PT1H22M59.551S'), ('PT0S'), ('PT6H4M29.212S'), ('PT0S'),
    ('PT2M55.126S'), ('PT54M4.12S'), ('PT3H6M5.74S'), ('PT16H27M52.069S')
SELECT TimeInput, dbo.f_GetTime(TimeInput) AS TimeValue FROM @Input

这将返回:

TimeInput            TimeValue
-------------------- ----------------
PT1H22M59.551S       01:22:59.5510000
PT0S                 00:00:00.0000000
PT6H4M29.212S        06:04:29.2120000
PT0S                 00:00:00.0000000
PT2M55.126S          00:02:55.1260000
PT54M4.12S           00:54:04.1200000
PT3H6M5.74S          03:06:05.7400000
PT16H27M52.069S      16:27:52.0690000

推荐阅读