Другой возможный подход - преобразовать ввод текста Duration
в правильное выражение T-SQL
('PT1H2M18S'
будет преобразовано в '1*3600+2*60+18*1+0'
).После этого рассмотрим следующие два варианта:
Создать и выполнить динамический оператор, который будет оценивать каждое выражение, или
Определить функцию для выполнениявычисления
Ввод:
CREATE TABLE #Data (
Duration varchar(50)
)
INSERT INTO #Data
(Duration)
VALUES
('PT10M13S'),
('PT13M22S'),
('PT1H2M18S'),
('PT100H'),
('PT11S')
Динамический оператор:
DECLARE @stm nvarchar(max)
SET @stm = N''
SELECT @stm = @stm +
CONCAT(
'UNION ALL SELECT ''',
Duration,
''' AS [Duration], ',
REPLACE(REPLACE(REPLACE(REPLACE(Duration, 'H', '*3600+'), 'M', '*60+'), 'S', '*1+'), 'PT', ''),
'0 AS [Seconds] '
)
FROM #Data
SET @stm = STUFF(@stm, 1, 10, N'')
EXEC (@stm)
Пользовательская функция:
CREATE FUNCTION [udfCalculateHMS] (@expression varchar(100))
RETURNS int
AS
BEGIN
DECLARE @result int
DECLARE @s varchar(100)
--
SET @result = 0
WHILE (CHARINDEX('+', @expression) > 0) BEGIN
SET @s = SUBSTRING(@expression, 1, CHARINDEX('+', @expression) - 1)
SET @expression = STUFF(@expression, 1, CHARINDEX('+', @expression), '')
SET @result = @result +
CONVERT(int, SUBSTRING(@s, 1, CHARINDEX('*', @s) - 1)) *
CONVERT(int, STUFF(@s, 1, CHARINDEX('*', @s), ''))
END
-- Return value
RETURN @result
END
SELECT
Duration,
dbo.udfCalculateHMS(CONCAT(REPLACE(REPLACE(REPLACE(REPLACE(Duration, 'H', '*3600+'), 'M', '*60+'), 'S', '*1+'), 'PT', ''), '0')) AS Seconds
FROM #Data
Вывод:
Duration Seconds
PT10M13S 613
PT13M22S 802
PT1H2M18S 3738
PT100H 360000
PT11S 11