【问题标题】:How can I select the data from the last 7 days between hours如何在几个小时之间选择过去 7 天的数据
【发布时间】:2017-11-23 19:39:01
【问题描述】:

我正在尝试查询 7 天前创建的数据,但我只需要 11PM 和 7AM 的时间段。我实际上正在使用 SQL Server。

表格是这样的:

COD  CREATED
---------------------------------------
6001 2017-11-22 22:03:23.5007015 -02:00
6002 2017-11-22 23:03:24.3593854 -02:00 
6003 2017-11-23 06:03:24.7344270 -02:00
6004 2017-11-23 13:03:25.1680686 -02:00
6005 2017-11-23 23:56:00.6874197 -02:00
6006 2017-11-24 05:33:58.4243013 -02:00
6007 2017-11-24 22:40:08.3255570 -02:00
6008 2017-11-24 23:42:50.9885384 -02:00

这就是我真正想要查询的内容

COD  CREATED 
---------------------------------------
6002 2017-11-22 23:03:24.3593854 -02:00
6003 2017-11-23 06:03:24.7344270 -02:00
6005 2017-11-23 23:56:00.6874197 -02:00
6006 2017-11-24 05:33:58.4243013 -02:00
6008 2017-11-24 23:42:50.9885384 -02:00

我现在可以使用between getdate() and getdate()-7 来获取时间段,但我不知道如何过滤时间。

提前感谢您的帮助:)

【问题讨论】:

  • CREATED 列是 varchar 数据类型等吗?它似乎在末尾连接了-02:00
  • 它是一个 DateTime 列,而 -02:00 是它的时区

标签: sql sql-server tsql datetime


【解决方案1】:

为了获得最佳性能潜力,请避免对数据使用函数。这最大限度地利用了已创建列上的索引的机会,并且还节省了对每一行数据执行函数调用的时间。

SELECT * 
FROM Table1
WHERE created >= dateadd(hour,-145,dateadd(dd, datediff(dd,0, getDate()), 0))
AND created < dateadd(hour,-137,dateadd(dd, datediff(dd,0, getDate()), 0))

您可以选择您喜欢的方法,以下两组都通过“截断”getdate() 将时间设置为 00:00:00+0000000 来工作。然后减去 (-724)+23 和 (-724)+23+8(-145 和 -137)。

SELECT
  dateadd(hour,-145,dateadd(dd, datediff(dd,0, getDate()), 0))
, dateadd(hour,-137,dateadd(dd, datediff(dd,0, getDate()), 0))

, dateadd(hour,-145,convert(datetime,convert(date,getdate())))
, dateadd(hour,-137,convert(datetime,convert(date,getdate())))

如有必要,从这些数字中加或减 24 即可找到您需要的时间段。

哦,请注意,对于日期/时间范围,“介于”不是请勿在此处使用“介于”。有关此主题的更多信息,请阅读Bad habits to kick : mis-handling date / range queries

CREATE TABLE Table1
    ([COD] int, [CREATED] datetime2)
;
    
INSERT INTO Table1
    ([COD], [CREATED])
VALUES
  (6001, '2017-11-22 22:03:23.5007015 -02:00')
, (6002, '2017-11-22 23:03:24.3593854 -02:00')
, (6003, '2017-11-23 06:03:24.7344270 -02:00')
, (6004, '2017-11-23 13:03:25.1680686 -02:00')
, (6005, '2017-11-23 23:56:00.6874197 -02:00')
, (6006, '2017-11-24 05:33:58.4243013 -02:00')
, (6007, '2017-11-24 22:40:08.3255570 -02:00')
, (6008, '2017-11-24 23:42:50.9885384 -02:00')
;

update table1
set created = dateadd(day,-7,created)
;

结果:

|  COD |                     CREATED |
|------|-----------------------------|
| 6001 | 2017-11-15 22:03:23.5007015 |
| 6002 | 2017-11-15 23:03:24.3593854 |
| 6003 | 2017-11-16 06:03:24.7344270 |
| 6004 | 2017-11-16 13:03:25.1680686 |
| 6005 | 2017-11-16 23:56:00.6874197 |
| 6006 | 2017-11-17 05:33:58.4243013 |
| 6007 | 2017-11-17 22:40:08.3255570 |
| 6008 | 2017-11-17 23:42:50.9885384 |

查询

SELECT * 
FROM Table1
WHERE created >= dateadd(hour,-145,dateadd(dd, datediff(dd,0, getDate()), 0))
AND created < dateadd(hour,-137,dateadd(dd, datediff(dd,0, getDate()), 0))
;

结果

|  COD |                     CREATED |
|------|-----------------------------|
| 6005 | 2017-11-16 23:56:00.6874197 |
| 6006 | 2017-11-17 05:33:58.4243013 |

Demo

【讨论】:

    【解决方案2】:

    我可以在 getdate() 和 getdate()-7 之间使用来获取时间段,但我不知道如何过滤时间。

    您可以使用DATEPART(HOUR, datetimevalue) 来获取小时。

    例如,如果您只想要从晚上 11 点到晚上 7 点的时间:

    SELECT *
      FROM theTable
     WHERE (DATEPART(HOUR, CREATED) > 22  --greater than 10pm hour
            OR                            --OR
            DATEPART(HOUR, CREATED) < 8   --less than 8pm hour
           )
        --put any other datediff logic here
    

    产生输出:

    COD     CREATED
    6002    2017-11-22 23:03:24.3594 -02:00
    6003    2017-11-23 06:03:24.7344 -02:00
    6005    2017-11-23 23:56:00.6874 -02:00
    6006    2017-11-24 05:33:58.4243 -02:00
    6008    2017-11-24 23:42:50.9885 -02:00
    

    在这种情况下,我将 datetimeoffset(4) 用于 CREATED 列以允许 -02:00 时区。

    如需查看完整代码:http://sqlfiddle.com/#!6/963a1/7/0

    【讨论】:

      【解决方案3】:

      如果您使用的是 SQL Server 2008 或更新版本,则可以转换为 Time 数据类型

      SELECT * FROM TBL
      WHERE (CAST(CREATED AS TIME) >= '23:00:00' OR CAST(CREATED AS TIME) <= '07:00:00')
      AND CONVERT(DATE,CREATED) BETWEEN  DATEADD(DAY,-7,CONVERT(DATE,GETDATE())) AND CONVERT(DATE,GETDATE())
      

      SQLFiddle

      否则,您可以使用以下查询:

      SELECT * FROM TBL
      WHERE CONVERT(DATE,CREATED) BETWEEN  DATEADD(DAY,-7,CONVERT(DATE,GETDATE())) AND CONVERT(DATE,GETDATE())
      AND ( DATEPART('hour',CREATED) >= 23 
            OR DATEPART('hour',CREATED) <= 6 )
      

      注意:我使用CONVERT(DATE,CREATED) 来消除比较日期时的时间

      【讨论】:

        【解决方案4】:

        您可以使用以下查询:

        SELECT *
        FROM  Table1
        WHERE Created >= (DATE(NOW()) - INTERVAL 7 DAY)
        ORDER BY COD DESC
        

        【讨论】:

        • 这不是 SQL Server 查询
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-08-07
        • 1970-01-01
        • 1970-01-01
        • 2013-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多