我有以下字符串:PT0H8M30S
。 “ H”之前的数字表示小时,“ M”之前的数字表示分钟,而“ S”之前的数字表示秒。...如何使用SQL函数将其仅转换为分钟? >
结果应该是:8.5分钟
非常感谢您!!!!
答案 0 :(得分:6)
我们可以使用SQL Server中的基本字符串函数(.flex-fill:nth-child(2) .callout {
color: red
}
,PATINDEX
和CHARINDEX
)来解析您的时间字符串。要获取每个单元的结束点,我们可以寻找SUBSTRING
,H
或M
。要获取开始点,我们可以查找紧接特定时间单位之前的一位或两位数。这会导致产生一些冗长的SQL Server代码,但对于任何时间单位(以出现顺序)的存在/不存在,它都是相当健壮的。
S
答案 1 :(得分:1)
这里是一种替代方法,它首先尝试通过替换将其转换为TIME。
因为一旦有了TIME数据类型,就很容易从中获取分钟数。
SELECT col,
(CASE
WHEN col LIKE 'PT%H%M%S'
THEN CAST(DATEDIFF(SECOND, 0, CAST(REPLACE(REPLACE(REPLACE(SUBSTRING(col,3,LEN(col)),'H',':'),'M',':'),'S','') AS TIME))/60.0 AS DECIMAL(10,2))
WHEN col LIKE 'PT%M%S'
THEN CAST(DATEDIFF(SECOND, 0, CAST(REPLACE(REPLACE(REPLACE(col,'PT','0:'),'M',':'),'S','') AS TIME))/60.0 AS DECIMAL(10,2))
WHEN col LIKE 'PT[0-9]M' OR col LIKE 'PT[0-9][0-9]M'
THEN CAST(REPLACE(REPLACE(col,'PT',''),'M','') AS DECIMAL(10,2))
END) AS col_minutes
FROM
(values
('PT0H8M30S')
,('PT10H08M05S')
,('PT8M30S')
,('PT8M')
,('Blah')
) AS data(col);
返回:
col col_minutes
----------- ------
PT0H8M30S 8.50
PT10H08M05S 608.08
PT8M30S 8.50
PT8M 8.00
Blah NULL
CASE仅用于确保字符串采用预期格式。