Mysql 在两个日期之间的时间段内从数据库检索数据

Mysql 在两个日期之间的时间段内从数据库检索数据,mysql,sql,datetime,mariadb,Mysql,Sql,Datetime,Mariadb,我有一个HTML表格,其中显示从设备实时接收的记录 我希望允许用户从两个日期之间的时间间隔获取数据,例如,在晚上22:00:00到次日06:00:00检索“2019-09-20”和“2019-09-25”之间的所有数据,其中所有数据都存储在UTC上 我可以让它从UTC 06:00:00到UTC 08:00:00运行,检索许多结果,但对于此查询,从UTC 22:12:00到UTC 08:00:00不可用 此查询返回以下结果: SELECT d0_.id AS id_0 , d0_.uui

我有一个HTML表格,其中显示从设备实时接收的记录

我希望允许用户从两个日期之间的时间间隔获取数据,例如,在晚上22:00:00到次日06:00:00检索“2019-09-20”和“2019-09-25”之间的所有数据,其中所有数据都存储在UTC上

我可以让它从UTC 06:00:00到UTC 08:00:00运行,检索许多结果,但对于此查询,从UTC 22:12:00到UTC 08:00:00不可用

此查询返回以下结果:

SELECT d0_.id AS id_0
     , d0_.uuid AS uuid_1
     , d0_.datetime_utc AS datetime_utc_2
     , d0_.macaddress AS macaddress_3 
     , d0_.channel_name AS channel_name_5
     , d0_.device_id AS device_id_42
     , d0_.country_id AS country_id_43 
  FROM detection d0_ 
  JOIN device d4_ 
    ON d0_.device_id = d4_.id 
  JOIN country c7_ 
    ON d0_.country_id = c7_.id 
 WHERE (DATE(d0_.datetime_utc) BETWEEN '2019-09-20' AND '2019-09-25')
   AND (TIME(d0_.datetime_utc) BETWEEN '06:00:00' AND '08:00:00') 
 ORDER 
    BY d0_.datetime_utc ASC;
这是MySQL Workbench上返回的结果日志:

1000 row(s) returned
现在,如果我运行查询以获得相同日期间隔之间以及22:00:00 UTC到08:00:00 UTC之间的结果:

选择d0.id作为id\u 0,d0.uuid作为uuid\u 1,d0.datetime\u utc作为datetime\u utc\u 2,d0.macaddress作为macaddress\u 3,d0.channel\u name作为channel\u name\u 5,d0.device\u id作为device\u id\u 42,d0.country\u id作为country\u id\u 43 从检测d0_ d0上的内部连接设备d4。设备id=d4。id d0上的内部联接国家/地区c7\uID=c7\uID 其中日期0.日期时间0 utc介于“2019-09-20”和“2019-09-25”之间 “22:00:00”和“08:00:00”之间的时间0.datetime\utc 按d0\日期时间\ utc ASC订购; 尽管时间间隔大于第一个时间间隔,查询仍返回此结果:

0 row(s) returned
我认为这是因为开始时间大于结束时间,但我不知道如何解决它

为了澄清问题,查询描述如下:

"Give me all the records received all the days at night (defined by the TIME sentence) between 2 specific dates (defined by DATE sentence)."
谢谢


Joaquin.

测试两个时间间隔,一个从00:00:00到08:00:00,另一个从22:00:00到23:59:59


我不确定是否有分辨率大于1秒的时间数据。如果您这样做,您可能需要执行类似23:59:59.999的操作。

和TIMEd0.datetime\u utc在'22:00:00'和'23:59:59'之间或TIMEd0.datetime\u utc在'00:00:00'和'08:00:00'之间应该可以。谢谢,它在某些情况下可能有效,但可能会导致一些问题。例如,如果datetime==UTC+2的用户从9月1日凌晨1:00:00开始筛选,则数据库中存储的符合此条件的日期为8月31日23:00:00。如果用户也从9月1日开始按日期进行筛选,则此结果将被排除在结果之外。我只是试图为初始给定条件提供一个解决方案。如果你处理的是时区的变化,任何解决方案显然都会更加复杂。但基本原则是一样的——将任何跨越午夜的时间跨度分成两个跨度。这一点,您需要明确每个跨度被视为属于日期范围内的哪个日期,例如,假设跨度为21:00-1:00,21:00在周五,那么接下来的0:30是属于周六还是属于周五的伪延长部分?