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