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

标签 sql sql-server

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

非常感谢!!!

最佳答案

我们可以使用 SQL Server 中的基本字符串函数(PATINDEXCHARINDEXSUBSTRING)来解析您的时间字符串。要获得每个单元的结束点,我们可以查找HMS。要获得起点,我们可以查找紧接在特定时间单位之前的一位或两位数字。这会导致一些冗长的 SQL Server 代码,但它对于以任何出现顺序存在/不存在的任何时间单位都相当稳健。

WITH yourTable AS (
    SELECT 'PTx10H48M30S' AS string UNION ALL
    SELECT 'P2DT3H4M'
)

SELECT
    CASE WHEN CHARINDEX('D', string) > 0
         THEN
             CASE WHEN PATINDEX('%[0-9][0-9]D%', string) > 0
                  THEN CONVERT(float, SUBSTRING(string, PATINDEX('%[0-9][0-9]D%', string), 2)) * 24 * 60
                  ELSE CONVERT(float, SUBSTRING(string, PATINDEX('%[0-9]D%', string), 1)) * 24 * 60 END
         ELSE 0.0 END
    +
    CASE WHEN CHARINDEX('H', string) > 0
         THEN
             CASE WHEN PATINDEX('%[0-9][0-9]H%', string) > 0
                  THEN CONVERT(float, SUBSTRING(string, PATINDEX('%[0-9][0-9]H%', string), 2)) * 60
                  ELSE CONVERT(float, SUBSTRING(string, PATINDEX('%[0-9]H%', string), 1)) * 60 END
         ELSE 0.0 END
    +
    CASE WHEN CHARINDEX('M', string) > 0
         THEN
              CASE WHEN PATINDEX('%[0-9][0-9]M%', string) > 0
                  THEN CONVERT(float, SUBSTRING(string, PATINDEX('%[0-9][0-9]M%', string), 2))
                  ELSE CONVERT(float, SUBSTRING(string, PATINDEX('%[0-9]M%', string), 1)) END
         ELSE 0.0 END
    +
    CASE WHEN CHARINDEX('S', string) > 0
         THEN
             CASE WHEN PATINDEX('%[0-9][0-9]S%', string) > 0
                  THEN CONVERT(float, SUBSTRING(string, PATINDEX('%[0-9][0-9]S%', string), 2)) / 60
                  ELSE CONVERT(float, SUBSTRING(string, PATINDEX('%[0-9]S%', string), 1)) / 60 END
         ELSE 0.0 END
FROM yourTable;

enter image description here

Demo

关于将字符串转换为时间的SQL函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52493008/

相关文章:

sql - 根据员工类型计算总工资

c++ - 从远程计算机连接到 mssql 服务器会导致用户 '' 登录失败

sql-server - SSIS - 第二个脚本任务未在 Foreach 循环容器中执行

sql-server - 同时触发的 SSRS 报告订阅是否同时运行?

sql查询排序但在顶部显示特定值

sql - 使用 for 循环插入到表中

c# - For 循环直到 SQL 命令返回某个值

sql - 获得薪资第三高的员工

sql - 检查并更改 SQL 中列的空值或 null 值?

sql-server - 出现 "data too large for variable"错误时如何正确访问 FireDAC 数据集的 VARCHAR(MAX) 参数值?