我有一个字符串,其中包含以分钟和秒为单位的持续时间,为'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
吗?
答案 0 :(得分:4)
您需要将字符串拆分为':'char,因为该时间无效。这就是你获得NULL值的原因。
之后,您可以尝试解析分钟和秒。
最后,只需将分钟和秒添加到新的空白时间。
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
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