我有一个问题,我的SQL查询是用来获取事件的完整日历,一切工作正常,除非一个事件开始之前的当前视图开始,并在当前视图结束后结束,例如,如果我有一个事件开始在星期一,直到星期三,在星期二的天视图它没有显示出来。这是因为我不确定如何使用SQL查询来获取符合此标准的事件。我的当前查询如下:
$query = $conn->prepare('SELECT * FROM calendar WHERE start BETWEEN :start1 AND :end1 OR end BETWEEN :start AND :end ORDER BY start ASC');
$query->bindValue(':start1', $_POST['start']);
$query->bindValue(':end1', $_POST['end']);
$query->bindValue(':start', $_POST['start']);
$query->bindValue(':end', $_POST['end']);
$query->execute();
是否有可能形成一个SQL查询来获取所有事件,其中事件的持续时间使其在视图期间发生,但在视图期间不开始或结束?
人们常常把"找出两个间隔是否重叠"弄得过于复杂——我认为这就是你在这里所做的。他们试图列举所有可能发生重叠的方式。而事实上,一个非常简单的定义涵盖了所有这些:
两个区间重叠,如果:
- 第一个在第二个结束之前开始,和,
- 第二个在第一个结束之前开始。
$query = $conn->prepare('SELECT * FROM calendar WHERE start < :end AND :start < end ORDER BY start ASC');
$query->bindValue(':start', $_POST['start']);
$query->bindValue(':end', $_POST['end']);
$query->execute();
您通常需要花几分钟考虑的唯一变化是<
符号,以及如果一个开始于另一个结束的同一时刻,您是否认为两个间隔重叠(如果您希望这些间隔重叠,则使用<=
代替)