如何处理 DATEDIFF(MINUTE, '00:00', '24:20') 之类的场景?

How to Handle DATEDIFF(MINUTE, '00:00', '24:20') Like scenario?

我的Table里有一栏。我们在其中以格式 'HH:MM' 存储字符串值。在使用此 table 获取记录期间,一切正常

DATEDIFF(MINUTE, '00:00', ColumnName)

问题是当我们的值大于 23:59 时。 它显示错误

Conversion failed when converting date and/or time from character string.

任何人都可以建议我实现这种情况的正确方法。

试试这个

select DATEDIFF(MINUTE, '00:00', case when ISDATE(ColumnName)=0 then '00:00' else ColumnName end )

如果您将值存储为时间以外的其他值,为什么不只存储分钟数并转换为您想要输出的任何格式?

否则,我建议您将值转换为分钟:

select (cast(left(ColumnName, 2) as int) * 60 +
        cast(right(ColumnName, 2) as int)
       ) as Minutes

如果您不使用 date/time 值,则不需要使用 专门 为它们设计的函数。

编辑:

要处理超过 99 小时,请使用 charindex():

select (cast(left(ColumnName, charindex(':', ColumnName) - 1) as int) * 60 +
        cast(right(ColumnName, 2) as int)
       ) as Minutes

听起来你节省了一段时间的长度。尝试在几分钟内存储它。我的查询可以处理不同长度的数字,因为它基于冒号。

DECLARE @yourTable TABLE (ColumnName VARCHAR(10));
INSERT INTO @yourTable
VALUES  ('100:00'),
        ('24:20');

SELECT  ColumnName,
        (hr * 60) + minut AS time_period_in_minutes
FROM @yourTable
CROSS APPLY (SELECT CAST(SUBSTRING(ColumnName,0,CHARINDEX(':',ColumnName)) AS INT),
                    CAST(SUBSTRING(ColumnName,CHARINDEX(':',ColumnName) + 1,LEN(ColumnName)) AS INT)) CA(hr,minut)

结果:

ColumnName time_period_in_minutes
---------- ----------------------
100:00     6000
24:20      1460