如何从SQL Server获取最近两个小时的记录

如何从SQL Server获取最近两个小时的记录,sql,sql-server,Sql,Sql Server,我有日期(2017-01-07)和时间(23:58:06 PM)两栏,我尝试了下面的查询 SELECT * FROM Report WHERE Time > DATEADD(HOUR, -2, GETDATE()) 时间是NVARCHAR,日期是DATE 但我得到了一个错误,名为“从字符串转换日期和/或时间时转换失败” 请帮我解决这个问题!!!我是SQL初学者您要做的是将它们添加到一起,然后进行比较以获取日期。不幸的是,您不能同时添加日期和时间。幸运的是,您可以同时添加datetime和

我有日期(2017-01-07)和时间(23:58:06 PM)两栏,我尝试了下面的查询

SELECT * FROM Report WHERE Time > DATEADD(HOUR, -2, GETDATE())
时间是NVARCHAR,日期是DATE

但我得到了一个错误,名为“从字符串转换日期和/或时间时转换失败”


请帮我解决这个问题!!!我是SQL初学者

您要做的是将它们添加到一起,然后进行比较以获取日期。不幸的是,您不能同时添加
日期
时间
。幸运的是,您可以同时添加
datetime
time

因此:

如果
time
是字符,那么您也应该能够转换该字符:

WHERE (CAST(date as datetime) + CAST(time as time)) >= DATEADD(HOUR, -2, GETDATE())
或者,如果PM是
时间的冗余部分,则:

WHERE (CAST(date as datetime) + CAST(LEFT(time, 8) as time)) >= DATEADD(HOUR, -2, GETDATE())
不幸的是,这不会使用索引。但是,一种简单的方法是使用计算列和索引:

alter table report add datetimecol as (CAST(date as datetime) + time);
create index idx_report_datetimecol on report(datetimecol);
编辑:

您的数据似乎有问题。尝试:

select time
from report
where try_convert(time, timecol) is null;
或:


如果日期列也是一个字符串(不使用本机数据类型真是个坏主意),那么也要测试它。

时间似乎是一个文本字段

应考虑将日期和时间组合以获取DATETIME字段,然后在WHERE子句中使用它。

这样的回答可能有助于:


Time
列的数据类型是什么?您能显示DDL/schema吗,这样我们就明白了?谢谢您宝贵的回复,但我还是收到了与此错误相同的错误(表“Report”中的列“datetimecol”不能用于索引或统计信息,也不能用作分区键,因为它是不确定的。),此表正在使用脚本连续每5分钟更新一次,因此,我目前所做的是选择前300行来显示最近2小时的报告。@T.Anand。好吧,至少您正在学习使用内置数据类型的课程。他们在那里是有原因的。您现在必须搜索结构不正确的字符串。我使用时间列作为NVARCHAR,它包含am/PM。是的,根据您的建议,我已组合了日期和时间字段,现在此查询工作正常。。。!非常感谢。
select time
from report
where try_convert(time, timecol) is null;
select time
from report
where try_convert(time, left(timecol, 8)) is null;
SELECT * 
FROM Report 
WHERE CAST(Date AS DATETIME) + CAST(Time AS DATETIME) >= DATEADD(HOUR, -2, GETDATE());