选择过去24小时加上当天的前8小时

时间:2016-01-21 13:52:31

标签: sql sql-server

我有一个查询,它是过去24小时或记录并对其进行计数,然后按ID对记录进行分组。

我想要的是选择过去的24小时加上当天的前8小时

SELECT controllerID,
       DATEPART (HOUR, dateadd(hour, datediff(hour, 0, dtReading), 0)) as TimeStampHour,
       Count(*) As Count
FROM [ReaderData]
WHERE dtReading >= dateadd(day,datediff(day,1,GETDATE()),0)
  AND dtReading < dateadd(day,datediff(day,0,GETDATE()),0)
  AND (EventType = '(0x03)Door state low')
  AND CardID = 'fffffff0'
GROUP BY controllerID, dateadd(hour, datediff(hour, 0, dtReading), 0)
ORDER BY controllerID, dateadd(hour, datediff(hour, 0, dtReading), 0);

现在我可以通过更改where条件中的-1和0来更改日期,以更改日期。目前这个查询产生这样的结果

    controllerID    TimeStampHour   Count
    13                  0           129
    13                  1           114
    13                  2           104
    13                  3           96
    13                  4           111
    13                  5           114
    13                  6           97
    13                  7           116
    13                  8           62
    13                  9           82
    13                  11          62
    13                  12          112
    13                  13          78
    13                  14          20
    13                  15          11
    13                  16          116
    13                  17          122
    13                  18          106
    13                  19          126
    13                  20          125
    13                  21          105
    13                  22          122
    13                  23          16
    28                  10          12
    28                  16          8
    30                  0           162
    30                  1           161
    30                  2           161
    30                  3           62
    30                  4           61
    30                  5           62

正如您所看到的,控制器ID每小时都有一个计数

我想要的是将时间延长8小时到第二天 例如,在控制器ID 13的第23个小时之后,TimeStampHour将为0,但这将是已经选择的日期之后的第二天

2 个答案:

答案 0 :(得分:1)

似乎你需要更换

dtReading >= dateadd(day,datediff(day,1,GETDATE()),0)
AND dtReading < dateadd(day,datediff(day,0,GETDATE()),0)

dtReading between dateadd(day,datediff(day,1,GETDATE()),0) AND dateadd(hour,8,dateadd(day,datediff(day,0,GETDATE()),0))

答案 1 :(得分:0)

尝试这样,它几乎与@Dmitry Polyakov相似

SELECT controllerID,
       Datepart (HOUR, Dateadd(hour, Datediff(hour, 0, dtReading), 0)) AS TimeStampHour,
       Count(*)                                                        AS Count
FROM   [ReaderData]
WHERE  dtReading >= Dateadd(day, Datediff(day, 1, Getdate()), 0)
       AND dtReading < Dateadd(hour, 8, Dateadd(day, Datediff(day, 0, Getdate()), 0))
       AND ( EventType = '(0x03)Door state low' )
       AND CardID = 'fffffff0'
GROUP  BY controllerID,
          Dateadd(hour, Datediff(hour, 0, dtReading), 0)
ORDER  BY controllerID,
          Dateadd(hour, Datediff(hour, 0, dtReading), 0);