对于表格中的每一行,我们将此格式的日期/时间存储在varChar列中:2013-05-26 20:22:07.2894。
我们如何在T_SQL WHERE语句中使用此列来检索最近1小时的行数?
我们尝试了这个并且它有效:WHERE Time_Stamp> '2013-05-26 18:00:00:0000'但是我们想让T-SQL自动工作,而不是硬编码日期/领带。
答案 0 :(得分:4)
这是一种可靠的方法(意味着它将使用索引):
where Time_Stamp > convert(varchar(255), getdate() - 1.0/24, 121)
答案 1 :(得分:1)
要将VARCHAR
转换为DATETIME
,只需使用;
CONVERT(DATETIME, SUBSTRING(myDate, 1, 23), 121);
... myDate是你的列名。转换为日期时间后,与GETDATE()
的比较很简单。
答案 2 :(得分:0)
您可以将getdate()
与dateadd()
合并,从当前时间减去1小时:
WHERE Time_Stamp > dateadd(hour, -1, getdate())
varchar
将转换为datetime
进行比较,因为日期时间为higher precedence。
答案 3 :(得分:0)
Datediff(hour, time_stamp, getdate()) < 1
但是你可能在将时间戳存储为varchar时犯了一个错误。当您将其存储为varchar时,SQL将必须检查表中的每个候选行以查找记录,并且必须将timestamp
的每个单独值转换为日期行,以便能够识别您要查找的记录。希望您的查询条件是这样的,这只需要检查少量记录。
但实际上,没有理由将日期存储为字符串。将它们存储为datetime占用的空间更少,查询速度更快,并且可能允许SQL选择更好的查询计划。从服务器隐藏值的性质只会阻止它帮助你,并使你不得不担心当字段值为'Hello'而不是'2013-05-26 18:00:00:0000时会发生什么'您应该将日期存储为日期时间,并且应该为它构建适当的索引(您需要的索引的详细信息需要比您提供的系统更多的信息)。