如何从小时之间的最后7天中选择数据

时间:2017-11-23 19:39:02

标签: sql sql-server tsql datetime

我试图查询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来获取句号,但我不知道如何过滤时间。

提前感谢您的帮助:)

4 个答案:

答案 0 :(得分:1)

如果您使用的是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)来消除比较日期的时间

答案 1 :(得分: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))

你可以选择你喜欢哪种方法,下面两组都按照&#34;截断&#34; getdate()将时间设置为00:00:00 + 0000000。然后扣除(-7 * 24)+23和(-7 * 24)+ 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,以找到所需的时间段。

哦,请注意&#34;&#34; 对于日期/时间范围来说是件好事。 请勿在&#34;之间使用&#34;此处即可。有关此主题的更多信息,请阅读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 :(得分:1)

  

我可以在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 :(得分:0)

您可以使用以下查询:

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