【问题标题】: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”实际上代表什么?这不是一天中的有效时间。

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


【解决方案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 )
    

    【讨论】:

      猜你喜欢
      • 2017-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      • 1970-01-01
      • 2016-07-11
      • 1970-01-01
      相关资源
      最近更新 更多