将'mm:ss'转换为SQL Server中的时间

时间:2018-03-08 00:18:28

标签: sql sql-server azure-sql-database

我有一个字符串,其中包含以分钟和秒为单位的持续时间,为'1302:47'

我想将它存储在SQL Server中,我选择了time数据类型。

如何将'1302:47'转换为hrs:mins:secs转换为time数据类型?

我试过

SELECT TRY_PARSE('1302:40' AS time)

SELECT TRY_CONVERT(time, '1302:40') 

并且两次都以NULL结尾意味着转换失败。

我期待21:7:40,如21小时,7分钟和40秒。

我应该使用不同的数据类型吗?

我应该将它全部转换为秒并只存储为int吗?

1 个答案:

答案 0 :(得分:4)

您需要将字符串拆分为':'char,因为该时间无效。这就是你获得NULL值的原因。

之后,您可以尝试解析分钟和秒。

最后,只需将分钟和秒添加到新的空白时间。

支持最大23h的示例:

DECLARE @date VARCHAR(20) = '1302:40';
DECLARE @min INT = ISNULL(TRY_PARSE(LEFT(@date,CHARINDEX(':',@date)-1) AS INT), 0);
DECLARE @sec INT = ISNULL(TRY_PARSE(RIGHT(@date,LEN(@date)-CHARINDEX(':',@date)) AS INT), 0);

DECLARE @time TIME = '00:00'
PRINT DATEADD(s, @sec, DATEADD(mi, @min, @time));
-- Outputs: 21:42:40.0000000

支持超过23小时的示例:

DECLARE @date VARCHAR(20) = '1302:47';
--DECLARE @date VARCHAR(20) = '3600:60';
DECLARE @min INT = ISNULL(TRY_PARSE(LEFT(@date,CHARINDEX(':',@date)-1) AS INT), 0);
DECLARE @sec INT = ISNULL(TRY_PARSE(RIGHT(@date,LEN(@date)-CHARINDEX(':',@date)) AS INT), 0);

DECLARE @time TIME = '0001-1-1 00:00'
IF @min < 1440
BEGIN
    PRINT CAST(DATEADD(s, @sec, DATEADD(mi, @min, @time)) AS VARCHAR(8));
END
ELSE
BEGIN
    IF @sec = 60
    BEGIN
        SET @sec = 0;
        SET @min = @min +1;
    END
    PRINT CONCAT(@min/60, ':', FORMAT(@min - (@min/60) * 60,'0#'), ':', FORMAT(@sec,'0#'))
END

-- Scenario #1. Given '1302:47', outputs: 21:42:47
-- Scenario #2. Given '3600:60', outputs: 60:01:00