如何处理DATEDIFF(分钟,'00:00','24:20')喜欢的场景?

时间:2015-06-10 12:10:19

标签: sql sql-server sql-server-2014

我的表格中有一栏。我们以格式'HH:MM'存储字符串值。在使用此表获取记录期间,每个事情都可以正常使用

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

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

  

从字符串转换日期和/或时间时转换失败。

有人可以建议我采用正确的方法来实现这种情况。

3 个答案:

答案 0 :(得分:5)

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

否则,我建议你只需将值转换为分钟:

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

如果您没有使用日期/时间值,则无需使用专为其设计的 功能。

编辑:

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

尝试这个

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