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

Posted

技术标签:

【中文标题】如何处理 DATEDIFF(MINUTE, \'00:00\', \'24:20\') 类似的场景?【英文标题】:How to Handle DATEDIFF(MINUTE, '00:00', '24:20') Like scenario?如何处理 DATEDIFF(MINUTE, '00:00', '24:20') 类似的场景? 【发布时间】:2015-06-10 12:10:18 【问题描述】:

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

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

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

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

谁能建议我实现这种情况的正确方法。

【问题讨论】:

正确的方法是使用适当的数据类型。 实际上我们必须保存大于 '23:59' 的值,以便我们将数据类型设为 Varchar。 '24:20' 这样的东西不能直接转换为TIMEDateTIME。您最好的选择可能是使用: 将其拆分,然后将小时乘以 60 并添加分钟 SQL Server 没有表示时间跨度的数据类型(它只有表示一天中某个时间的类型)。因此,表示此数据的最自然方式可能是int 分钟数(如果您需要分钟粒度)。将其转换为 hh:mm string (或转换 from 这样的字符串)作为 UI 问题,而不是靠近 DB。 “24:20”实际上代表什么?这不是一天中的有效时间。 【参考方案1】:

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

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

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

【讨论】:

如果我们有 '100:00' 这样的值,它就会失败。 @AshishBisht 。 . .见编辑。它现在应该可以工作了。【参考方案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

【讨论】:

【参考方案3】:

试试这个

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

【讨论】:

以上是关于如何处理 DATEDIFF(MINUTE, '00:00', '24:20') 类似的场景?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理熊猫条形图中恼人的间隙

表单关闭后如何处理非托管资源? [复制]

android如何处理电话号码中的+-sign

问题21:如何处理二进制文件

如何处理最终字符串?

如何处理 MKDirections Request 的错误