比较SQL Server T-SQL中的日期/时间

时间:2013-05-26 18:48:09

标签: sql sql-server tsql

对于表格中的每一行,我们将此格式的日期/时间存储在varChar列中:2013-05-26 20:22:07.2894。

我们如何在T_SQL WHERE语句中使用此列来检索最近1小时的行数?

我们尝试了这个并且它有效:WHERE Time_Stamp> '2013-05-26 18:00:00:0000'但是我们想让T-SQL自动工作,而不是硬编码日期/领带。

4 个答案:

答案 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()的比较很简单。

A very simple SQLfiddle

答案 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时会发生什么'您应该将日期存储为日期时间,并且应该为它构建适当的索引(您需要的索引的详细信息需要比您提供的系统更多的信息)。