【问题标题】:Identify rows where the time difference between two columns exceed 4 hours识别两列之间的时间差超过 4 小时的行
【发布时间】:2015-10-29 13:21:53
【问题描述】:

我的表中有两列称为 GXHEAD。有 PRECISETIME 和 DEVALERT。

PRECISETIME 和 DEVALERT 都将时间保留为 varchar(255),格式为“DD/MM/YYYY HH:MM:SS”(例如:“20/03/2014 14:07:11”)。

我想找出 DEVALERT 超过 PRECISETIME 4 小时的所有行。

【问题讨论】:

  • 不要DATETIME值存储为VARCHAR...
  • 事后看来我不会这样做,但它已经上线了,我重构它的影响不小。
  • 只需将列转换(或转换)为DATETIME,然后对它们执行DATEDIFF...

标签: sql date time sql-server-2008-r2


【解决方案1】:

你可以试试这个:

DATEDIFF(Hour, Cast(PRECISETIME as DATETIME), Cast(DEVALERTas DATETIME)) > 4

还请注意,将日期存储为 varchar() 是一种不好的做法。您应该始终避免这种情况。

尝试设置这个:

set dateformat dmy

【讨论】:

  • 我得到以下信息:Msg 242, Level 16, State 3, Line 1 varchar 数据类型到 datetime 数据类型的转换导致值超出范围。
  • @TobyDerrum:- 看起来你需要反转列:DATEDIFF(Hour, Cast(DEVALERT as DATETIME), Cast(PRECISETIME as DATETIME)) > 4
  • @TobyDerrum:- 还可以尝试在查询顶部设置日期时间格式:set dateformat dmy
  • 我得到以下信息:Msg 241, Level 16, State 1, Line 2 从字符串转换日期和/或时间时转换失败。
  • @TobyDerrum:- 你能从你的数据库中添加一些示例日期吗?
【解决方案2】:

您需要将您的列CONVERT 转换为DATETIME 值并对其执行DATEDIFF()

您应该真正将您的值存储为适当的数据类型,因为这根本不是 SARGable。

Select  *
From    GXHEAD
Where   DateDiff(Hour, Convert(DateTime, PRECISETIME, 103), Convert(DateTime, DEVALERT, 103)) >= 4

【讨论】:

  • 我得到以下信息:Msg 242, Level 16, State 3, Line 1 将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。
  • @TobyDerrum 更新为使用英国格式日期的 103 格式的 CONVERT
  • 它运行了几行,然后输出以下消息:Msg 241, Level 16, State 1, Line 1 Conversion failed when convert date and/or time from string.
  • @TobyDerrum 看看您的数据 - 听起来该列中的其他内容不是DATETIME 格式。
  • 你说得对,我在 DEVALERT 中发现了一些 NULL 值,这很可能是导致问题的原因。
猜你喜欢
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-16
相关资源
最近更新 更多