我有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
参数的单个查询语句中完成吗?我正在为SSRS报告这样做,如果我不需要,我宁愿不采用存储过程。
答案 0 :(得分:3)
问题是“这里的问题是字符串需要从DateTime值逻辑构造”。
在OP引用的BETWEEN (Transact-sql) documentation中,示例D(日期时间)说明了这一点:
<强> d。将BETWEEN与日期时间值一起使用
以下示例检索日期时间值介于“20011212”和“20020105”之间的行。
SELECT BusinessEntityID,RateChangeDate
来自HumanResources.EmployeePayHistory
在'20011212'和'20020105'之间的RateChangeDate之间;
这使得DateTime值似乎需要作为字符串提供。他们没有。您可以使用日期时间。
Zohar的回答解决了问题的时移部分。
答案 1 :(得分:2)
最简单的解决方案(虽然不是sargable,因此可能不是最好的)只是从LogTime
值减去7小时:
DECLARE @DateTime DateTime = GETDATE();
SELECT *
FROM [LogEntries]
WHERE CAST(DATEADD(HOUR, -7, [LogTime]) AS DATE) = CAST(@DateTime AS DATE);
一个可攻击的解决方案有点麻烦,但仍然很容易:
SELECT *
FROM [LogEntries]
-- 07 am on the date of the @DateTime variable
WHERE [LogTime] >= CAST(CAST(@DateTime AS DATE) As DateTime) + CAST('00:07:00' As DateTime)
-- 07 am one day after the date of the @DateTime variable
AND [LogTime] < DATEADD(DAY, 1, CAST(CAST(@DateTime AS DATE) As DateTime) + CAST('00:07:00' As DateTime))
当然,如果您传递的是Date
变量而不是DateTime
,它会为您节省一次转化(您可以使用+将datetime
值加在一起,但不能date
1}} + time
,因此您仍然必须转换为datetime
):
SELECT *
FROM [LogEntries]
-- 7 AM
WHERE [LogTime] >= CAST(@Date As DateTime) + CAST('00:07:00' As DateTime)
-- 7 AM on the next day
AND [LogTime] <= DATEADD(DAY, 1, CAST(@Date As DateTime) + CAST('00:07:00' As DateTime))