首页 > 解决方案 > 获取特定时间范围的数据

问题描述

我正在尝试从 2018 年 9 月 24 日到 2018 年 9 月 26 日每天晚上 7 点到早上 7 点之间选择记录。
例子:

2018-09-24_____7 pm 至 7am____ 2018-09-25
2018-09-25_____7 pm 至 7am____ 2018-09-26
2018-09-26_____7 pm 至 7am____ 2018-09-27

通过使用此代码 A:我从晚上 7 点(2018 年 9 月 24 日)到早上 7 点(2018 年 9 月 26 日)获取记录。

If Trim(cbShift.Text) = "Morning" Then
startdt = (S_date.Text) & " 19:00:00.317"
enddt = (E_date.Text) & " 07:00:00.160" End If
SELECT FROM tb_test
WHERE  (DateCreate   BETWEEN convert(datetime,@startdt) AND convert(datetime,@enddt))

并通过使用此代码 B:

WHERE  DateCreate > convert(datetime,'2018-09-24') AND DateCreate <=
DATEADD(day,1,convert(datetime,'2018-09-26'))
AND (DATEPART(hh,DateCreate) >= 19 and DATEPART(hh,DateCreate) <= 24  )

or DateCreate > convert(datetime,'2018-09-24') AND DateCreate <=
DATEADD(day,1,convert(datetime,'2018-09-26'))
AND (DATEPART(hh,DateCreate) >= 0 and DATEPART(hh,DateCreate) <= 6  )

我明白了

2018-09-24 (00->7 和 19 ->24) 、2018-09-25 (00->7 和 19 ->24) 和 2018-09-26 (00->7 和 19 ->24) )

有没有一种方法可以像上面的示例一样获取数据。谢谢你的帮助

标签: mysqlsql

解决方案


我认为问题在于您的WHERE条款中的评估顺序。我总是OR在 SQL 中的运算符周围使用括号。以下适用于 MySQL 5.6。

SELECT * 
FROM tb_test
WHERE  datecreate between '2018-09-24 19:00:00' and '2018-09-26 07:00:00'
AND (hour(DateCreate) >= 19 or hour(DateCreate) < 7);

作为参考,我使用了这个测试模式:

CREATE table tb_test
(datecreate datetime);

CREATE OR REPLACE VIEW generator_16
AS SELECT 0 n UNION ALL SELECT 1  UNION ALL SELECT 2  UNION ALL 
 SELECT 3   UNION ALL SELECT 4  UNION ALL SELECT 5  UNION ALL
 SELECT 6   UNION ALL SELECT 7  UNION ALL SELECT 8  UNION ALL
 SELECT 9   UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL
 SELECT 12  UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL 
 SELECT 15;

CREATE OR REPLACE VIEW generator_256
AS SELECT ( ( hi.n << 4 ) | lo.n ) AS n
 FROM generator_16 lo, generator_16 hi;

INSERT INTO tb_test
SELECT date_add("2018-09-24",interval n hour)
FROM generator_256;

推荐阅读