【问题标题】:Best SQL query to select events between two dates选择两个日期之间事件的最佳 SQL 查询
【发布时间】:2015-10-19 08:39:33
【问题描述】:

在阅读了很多关于此的帖子后。我需要一种在两个日期之间选择事件的好方法。可能的情况如下图所示:

我的第一次尝试如下:

SELECT *
FROM events
WHERE 
(
 start_date BETWEEN $start_select AND  $end_select
 OR
 end_date BETWEEN $start_select AND $end_select
)
OR
(
 start_date <=  $start_select
 AND
 end_date >= $end_select
)

问题是查询需要很长时间。

然后我看到了这个帖子:Select data from date range between two dates @dmlukichev 谈到排除所有错误的选项:

类似这样的:

SELECT *
FROM events
WHERE NOT 
(
 start_date <  $start_select
 OR
 end_date > $end_select
)

但这对我不起作用。

有什么想法吗?

【问题讨论】:

  • 如果start_date &gt; end_date$start_select &gt; $end_select,最后一个应该可以正常工作。你确定这两个条件都成立吗?
  • MySQL 是否支持 OVERLAPS?
  • 为什么查询需要很长时间? Is 不是“重”查询。桌子有多大? start_dateend_date 列上是否有索引?
  • 我正在使用 wordpress,它需要 1sg,只有 3-4 个帖子!
  • 请以表格形式提供样本数据。

标签: mysql sql date datetime


【解决方案1】:

如果我的条件正确,这就是您所需要的。

SELECT * FROM events WHERE (end_date >=  $start_select AND start_date <= $end_select);

您将获得开始日期在 $end_select 之前且结束日期在 $start_select 之后的所有事件。

【讨论】:

  • 问题是下一个:如果您选择最后一天(或第一天)它不起作用。例如,我有一个从“25-10-2015”到“29-10-2015”的事件,那么我的选择范围是“29-10-2015”到“31-10-2015”,您的查询不起作用。
  • 我认为:SELECT * FROM events WHERE (end_date >= $start_select AND start_date
  • 是的,你是对的。我不确定是否应该在支票中包含实际日期。我更新了我的答案。
【解决方案2】:

可能有点晚(4 年),但我使用:

SELECT * FROM events WHERE  (end_date > $start_select AND start_date BETWEEN $start_select AND $end_select
    OR start_date < $end_select AND end_date BETWEEN $start_select AND $end_select
    OR (start_date < $start_select AND end_date > $end_select) BETWEEN $start_select AND $end_select
    )

【讨论】:

    猜你喜欢
    • 2015-04-01
    • 2011-07-04
    • 2012-03-12
    • 2013-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    相关资源
    最近更新 更多