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

时间:2017-01-07 17:08:36

标签: sql sql-server

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

SELECT * FROM Report WHERE Time > DATEADD(HOUR, -2, GETDATE())

时间是NVARCHAR,DATE是日期

但我收到错误称为“从字符串转换日期和/或时间时转换失败。”

请帮我解决这个问题!我是SQL Starter

2 个答案:

答案 0 :(得分:1)

您要做的是将它们一起添加,然后进行比较以获取日期。很遗憾,您无法一起添加datetime。很幸运的是,您可以一起添加datetimetime

所以:

WHERE (CAST(date as datetime) + time) >= DATEADD(HOUR, -2, GETDATE())

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

WHERE (CAST(date as datetime) + CAST(time as time)) >= DATEADD(HOUR, -2, GETDATE())

或者,如果PM是time的冗余部分,那么:

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;

或:

select time
from report
where try_convert(time, left(timecol, 8)) is null;

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

答案 1 :(得分:0)

似乎Time是一个TEXT字段。

您应该考虑将Date和Time结合起来获取DateTime字段,然后在WHERE子句中使用它。

SO中的这个答案有助于:https://stackoverflow.com/a/7289875/3270427

SELECT * 
FROM Report 
WHERE CAST(Date AS DATETIME) + CAST(Time AS DATETIME) >= DATEADD(HOUR, -2, GETDATE());
相关问题