Sql 标识两列之间的时间差超过4小时的行
我的表中有两列名为GXHEAD。有精确的时间和贬值 PRECISETIME和DEVALERT都将时间保存为varchar(255),格式为“DD/MM/YYYY HH:MM:SS”(例如:“20/03/2014 14:07:11”)Sql 标识两列之间的时间差超过4小时的行,sql,date,time,sql-server-2008-r2,Sql,Date,Time,Sql Server 2008 R2,我的表中有两列名为GXHEAD。有精确的时间和贬值 PRECISETIME和DEVALERT都将时间保存为varchar(255),格式为“DD/MM/YYYY HH:MM:SS”(例如:“20/03/2014 14:07:11”) 我想确定DEVALERT超过PreciseSTime 4小时的所有行。您需要将列转换为日期时间值,并对其执行日期差异() 您应该将您的值存储为适当的数据类型,因为这根本不是可搜索的 Select * From GXHEAD Where DateDiff(
我想确定DEVALERT超过PreciseSTime 4小时的所有行。您需要
将列转换为日期时间
值,并对其执行日期差异()
您应该将您的值存储为适当的数据类型,因为这根本不是可搜索的
Select *
From GXHEAD
Where DateDiff(Hour, Convert(DateTime, PRECISETIME, 103), Convert(DateTime, DEVALERT, 103)) >= 4
您可以尝试以下方法:
DATEDIFF(Hour, Cast(PRECISETIME as DATETIME), Cast(DEVALERTas DATETIME)) > 4
还要注意,将日期存储为varchar()是一种不好的做法。你应该总是避免这样
尝试设置此选项:
set dateformat dmy
不要将DATETIME
值存储为VARCHAR
…事后看来,我不会这样做,但它已经上线,我重构它的影响不小。只需将列转换(或强制转换)为DATETIME
,然后对它们执行DATEDIFF
。我得到以下信息:Msg 242,级别16,状态3,第1行将varchar数据类型转换为datetime数据类型导致值超出范围。@TobyDRUM:-看起来您需要反转列:DATEDIFF(Hour,Cast(DEVALERT作为datetime),Cast(PRECISETIME作为datetime))>4
@tobydrum:-还可以尝试如下设置日期时间格式:在查询的顶部设置日期格式dmy
。我得到以下信息:Msg 241,级别16,状态1,第2行从字符串转换日期和/或时间失败。@tobydrum:-可以从数据库中添加一些示例日期吗?我得到以下信息:Msg 242,级别16,状态3,第1行将varchar数据类型转换为datetime数据类型导致值超出范围。@TobyDrrum更新为使用103格式的CONVERT
,用于UK格式的日期。它运行几行,然后返回以下消息:Msg 241,级别16,状态1,从字符串转换日期和/或时间时,第1行转换失败。@TobyDrrum查看数据-该列中似乎有其他内容不是DATETIME
格式。您是对的,我在DEVALERT中发现了一些空值,这很可能是问题的原因。