我有5分钟间隔的数据,24小时滚动,如下所示:
LogTime
-------------
7/1/2017 7:01
7/1/2017 7:06
7/1/2017 7:11
7/1/2017 7:16
...
7/2/2017 6:56
我需要一个TSQL查询来选择给定日期的所有行,例如 07/02 00:00:00
到 07/02 06:59:59
的条目被认为是 07/01
数据的一部分 .
我在SSMS的编辑器窗格中使用此查询:
SELECT * FROM [LogEntries] WHERE [LogTime] BETWEEN '20170701 06:59:59' AND '20170702 07:00'
这里的问题是字符串需要从 DateTime
值逻辑构造 .
这可以在带有传入的 DateTime
参数的单个查询语句中完成吗?如果我不需要,我宁可不诉诸存储过程 .
2 回答
问题是“这里的问题是字符串需要从DateTime值逻辑构造” .
在OP引用的BETWEEN (Transact-sql) documentation中,示例D(对于日期时间)说:
这使得DateTime值似乎需要作为字符串提供 . 他们没有 . 您可以使用日期时间 .
佐哈尔的答案解决了问题的时移部分 .
最简单的解决方案(虽然不是sargable,因此它可能不是最好的)只是从
LogTime
值中减去7小时:一个sargable解决方案有点麻烦,但仍然很容易:
当然,如果传递
Date
变量而不是DateTime
,它将为您节省一次转换(您可以使用一起添加datetime
值,但不能date
time
,因此您仍然必须转换为datetime
):