选择BETWEEN DateTime值行的TSQL语法是什么

时间:2018-04-26 05:37:18

标签: sql-server tsql

我有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:0007/02 06:59:59的条目被视为07/01数据的一部分。

我在SSMS的编辑器窗格中使用此查询:

SELECT * FROM [LogEntries] WHERE [LogTime] BETWEEN '20170701 06:59:59' AND '20170702 07:00'

这里的问题是字符串需要从DateTime值逻辑构造。

这可以在带有传入DateTime参数的单个查询语句中完成吗?我正在为SSRS报告这样做,如果我不需要,我宁愿不采用存储过程。

2 个答案:

答案 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))