我试图查询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
来获取句号,但我不知道如何过滤时间。
提前感谢您的帮助:)
答案 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())
否则,您可以使用以下查询:
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 |
答案 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