我有日期(2017-01-07)和时间(23:58:06 PM)两栏,我试过以下查询
SELECT * FROM Report WHERE Time > DATEADD(HOUR, -2, GETDATE())
时间是NVARCHAR,DATE是日期
但我收到错误称为“从字符串转换日期和/或时间时转换失败。”
请帮我解决这个问题!我是SQL Starter
答案 0 :(得分:1)
您要做的是将它们一起添加,然后进行比较以获取日期。很遗憾,您无法一起添加date
和time
。很幸运的是,您可以一起添加datetime
和time
。
所以:
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());