SQL函数将字符串转换为时间

时间:2018-09-25 07:40:18

标签: sql sql-server

我有以下字符串:PT0H8M30S。 “ H”之前的数字表示小时,“ M”之前的数字表示分钟,而“ S”之前的数字表示秒。...如何使用SQL函数将其仅转换为分钟? > 结果应该是:8.5分钟

非常感谢您!!!!

2 个答案:

答案 0 :(得分:6)

我们可以使用SQL Server中的基本字符串函数(.flex-fill:nth-child(2) .callout { color: red } PATINDEXCHARINDEX)来解析您的时间字符串。要获取每个单元的结束点,我们可以寻找SUBSTRINGHM。要获取开始点,我们可以查找紧接特定时间单位之前的一位或两位数。这会导致产生一些冗长的SQL Server代码,但对于任何时间单位(以出现顺序)的存在/不存在,它都是相当健壮的。

S

enter image description here

Demo

答案 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仅用于确保字符串采用预期格式。