Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 标识两列之间的时间差超过4小时的行_Sql_Date_Time_Sql Server 2008 R2 - Fatal编程技术网

Sql 标识两列之间的时间差超过4小时的行

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(

我的表中有两列名为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(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中发现了一些空值,这很可能是问题的原因。