Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中查找序列的开始和结束日期_Mysql_Date - Fatal编程技术网

在MySQL中查找序列的开始和结束日期

在MySQL中查找序列的开始和结束日期,mysql,date,Mysql,Date,所以我基本上有一张桌子,每个房间每天有一个入口。我需要找到在该房间、酒店和便笺上分组的所有连续日期的开始和结束日期 property room date notes ---------------------------------------------- 2 101 2013-01-01 abc 2 101 2013-01-02 abc 2 101 2013-01-03 abc

所以我基本上有一张桌子,每个房间每天有一个入口。我需要找到在该房间、酒店和便笺上分组的所有连续日期的开始和结束日期

property     room   date        notes
----------------------------------------------
2            101    2013-01-01  abc
2            101    2013-01-02  abc
2            101    2013-01-03  abc
2            101    2013-01-04  abc
2            101    2013-01-05  xyz
2            101    2013-01-06  xyz
2            101    2013-01-15  abc
2            101    2013-01-16  abc
2            101    2013-01-17  abc
2            107    2013-01-02  def
2            107    2013-01-03  def
2            109    2013-01-01  abc
2            109    2013-01-02  abc
3            101    2012-12-31  abc
3            101    2013-01-01  abc
3            101    2013-01-02  abc
我需要能够查询它的基础上的财产和日期差不多。当我按日期搜索时,我应该能够使用序列开始日期之后的日期,并且仍然可以找到正确的开始日期。因此,如果我搜索say WHERE date='2013-01-02',我应该返回如下内容:

property   room   start_date      end_date    notes
----------------------------------------------------
2          101    2013-01-01      2013-01-04  abc
2          107    2013-01-02      2013-01-03  def
2          109    2013-01-01      2013-01-02  abc
3          101    2012-12-31      2013-01-02  abc
这将用于一个相当大的表,并返回数十万个结果,因此效率是一个主要问题。我发现并尝试应用了一些有问题的例子。大多数都太慢了,或者如果开始日期早于WHERE date条款,就不会返回正确的开始日期,等等

这里的任何帮助都将不胜感激


谢谢

您想要的数据结构可以使用group by获得:

要使用having子句获取特定日期的行,请执行以下操作:


我不确定是否还有其他更有效的方法,尽管这确实需要在整个表上进行聚合。

分析大型数据集并不是MySQL的强项,因此我怀疑您很难获得良好的性能。这个查询似乎可以解决手头的问题,但不一定是最快的

选择r.property、r.room、, MAXIFrr.date=r.date,并且是结束日期,rr.date,NULL结束日期, r、 注释 从r房间 加入选择r*,如果ry.room为空,1,0为\u开始, 如果rt.room为空,则1,0为结束 从SELECT*,DATE_SUBdate,间隔1天, DATE_ADDdate,从r房间到明天间隔1天 左会合室 在r.property=ry.property和r.room=ry.room和r.notes=ry.notes上 r.date=Y.date 左联合室 在r.property=rt.property和r.room=rt.room和r.notes=rt.notes上 r.明天=rt.date 其中ry.room为NULL或rt.room为NULL rr 在r.property=rr.property和r.room=rr.room和r.notes=rr.notes上 其中r.date='2013-01-02' 按r.属性、r.房间、r.注释分组
。请注意Fiddle中的索引,它们可以加快速度。

考虑提供适当的DDL和/或sqlfiddle以及所需的结果集对大型临时数据集的分析并不是MySQL的主要优势,我怀疑您不会轻易获得所需的性能。表中没有其他东西可以帮助您,比如唯一的预订id?嗯,我怀疑数据集并不能真正代表当前的问题。
select property, room, min(date) as start_date, max(date) as end_date, notes
from table t
group by property, room, notes;
select property, room, min(date) as start_date, max(date) as end_date, notes
from table t
group by property, room, notes
having date( '2013-01-02') between min(date) and max(date);