3

我们将这种格式的日期/时间存储在表中每一行的 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

4 回答 4

4

这是一个 sargable 方法(意味着它将使用索引):

where Time_Stamp > convert(varchar(255), getdate() - 1.0/24, 121)
于 2013-05-26T18:58:41.240 回答
1

要将您的转换VARCHAR为 a DATETIME,只需使用;

CONVERT(DATETIME, SUBSTRING(myDate, 1, 23), 121);

...其中 myDate 是您的列名。一旦它被转换为日期时间,与它的比较就很GETDATE()简单了。

一个非常简单的 SQLfiddle

于 2013-05-26T18:55:32.297 回答
0

您可以结合getdate()使用dateadd()从当前时间减去 1 小时:

WHERE Time_Stamp > dateadd(hour, -1, getdate())

varchar被转换为datetime用于比较,因为 datetime 具有更高的优先级

于 2013-05-26T18:50:50.027 回答
0
Datediff(hour, time_stamp, getdate()) < 1

但是您在将该时间戳存储为 varchar 时可能会出错。当您将其存储为 varchar 时,SQL 将不得不检查表上的每个候选行以查找记录,并且它必须将每个单独的值转换timestamp为日期线,以便能够识别您的记录正在找。希望您的查询条件是这样的,这只需要检查少量记录。

但实际上,没有理由将日期存储为字符串。将它们存储为日期时间占用更少的空间,导致更快的查询,并且可能允许 SQL 选择更好的查询计划。向服务器隐藏值的性质只会阻止它帮助您,并导致您不得不担心当字段值是“Hello”而不是“2013-05-26 18:00:00:0000”时会发生什么' 你应该将你的日期存储为 Datetime,并且你应该为它建立一个适当的索引(你需要的索引的细节需要比你提供的更多的关于你的系统的信息)。

于 2013-05-26T19:03:44.647 回答