Quassnoi和其他人已经发布了一些相关的解决方案,但是它们不适用于这种特殊情况。

在具有约200万条记录的MySql表中,
(id int,StartDate日期,EndDate日期)和一些信息。
我需要隔离涉及特定日期范围的记录(从-到)示例:哪些记录涉及11月

SELECT id
    FROM Records
    WHERE StartDate<="2015-11-30"
      AND EndDate>="2015-11-01"


开始日期和结束日期之间的差异通常很小,但可能很大(超过一年)。这就是为什么Quassnoi先前的答案不起作用的原因。
我不能让它在适当的时间运行。

任何帮助/建议将不胜感激。

最佳答案

这是一个难题。 INDEX不能正常工作。

但是,让我勾勒出一种解决方法,其中涉及一个额外的表和一些额外的处理。


选择一个时间段,例如“月”(与您的示例一样)。
生成另一个具有PRIMARY KEY(month,id)的表,其中id是预订的​​ID。 (我认为不需要任何其他列。)
对于每个记录(当前表中的记录),请使用预订id及其部分或全部跨度的月份在新表中填充一行或多行。
“哪些预订在11月使用房间”应该很容易且显而易见。
“在4月28日至5月4日期间预订使用房间的房间时,需要查找4月和5月的ID,然后检查实际的开始/结束日期以过滤掉不适用的日期。


如果使用“周”(而不是“月”),则新表中将有更多行,但是选择性更好–从长远来看,很难说哪个更好。

因此,查询变为类似以下内容。 (我假设$ start_date到$ end_date是DATE,并且包含在内。)

SELECT ...
    FROM new_table AS n
    JOIN bookings AS b USING(id)
    WHERE start_date <= n.month + INTERVAL 1 MONTH
      AND n.month <= $end_date
      AND ... same stuff for b. ...

07-24 17:53
查看更多