首页 文章

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

提问于
浏览
3

我有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 参数的单个查询语句中完成吗?如果我不需要,我宁可不诉诸存储过程 .

2 回答

  • 3

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

    在OP引用的BETWEEN (Transact-sql) documentation中,示例D(对于日期时间)说:

    D.将BETWEEN与datetime值一起使用以下示例检索日期时间值介于“20011212”和“20020105”之间的行(包括两者) . SELECT BusinessEntityID,RateChangeDate FROM HumanResources.EmployeePayHistory WHERE RateChangeDate BETWEEN'20011212''''20020105';

    这使得DateTime值似乎需要作为字符串提供 . 他们没有 . 您可以使用日期时间 .

    佐哈尔的答案解决了问题的时移部分 .

  • 2

    最简单的解决方案(虽然不是sargable,因此它可能不是最好的)只是从 LogTime 值中减去7小时:

    DECLARE @DateTime DateTime = GETDATE();
    
    SELECT * 
    FROM [LogEntries] 
    WHERE CAST(DATEADD(HOUR, -7, [LogTime]) AS DATE) = CAST(@DateTime AS DATE);
    

    一个sargable解决方案有点麻烦,但仍然很容易:

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

相关问题