如何处理 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'
这样的东西不能直接转换为TIME
或DateTIME
。您最好的选择可能是使用:
将其拆分,然后将小时乘以 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') 类似的场景?的主要内容,如果未能解决你的问题,请参考以下文章