我在这里看了很多解决方案,但是在我的情况下无法让它们工作。我肯定超出了我的 SQL 技能水平。
我有一个表,其中包含每个课程的课程开始和结束日期/时间:
Table: class_times
Columns:
time_class_id
time_end
time_start
time_end
和time_start
是Unix timestamps
。
当学生将课程放入购物车时,我必须检查并确保没有时间与购物车中的任何其他课程发生冲突。这是一个时间范围。可以是4小时课程或2小时课程。如果有任何时间冲突,我必须提醒学生。 time_class_id是一个类,它可以很容易地有十几行日期/时间和不同的日期/时间。
这是我得到的最接近但这似乎只发现开始和结束时间完全相同的冲突:
SELECT a.time_class_id, a.time_start, a.time_end,
b.time_class_id, b.time_start, b.time_end
FROM class_times a, class_times b
WHERE a.time_class_id in ($classes_in_cart)
AND b.time_class_id in ($classes_in_cart)
AND (a.time_class_id <> b.time_class_id
AND a.time_start >= b.time_start AND
a.time_end <= b.time_end)
非常感谢任何帮助。
答案 0 :(得分:0)
我想你想要这样的东西:
SELECT a.time_class_id, a.time_start, a.time_end,
b.time_class_id, b.time_start, b.time_end
FROM class_times a JOIN
class_times b
on find_in_set(a.time_class_id, $classes_in_cart) > 0 and
find_in_set(b.time_class_id, $classes_in_cart) > 0 and
a.time_class_id < b.time_class_id and
a.time_start <= b.time_end and
a.time_end >= b.time_start;
两个时间段重叠,一个在第二个结束之前开始,第一个结束在第二个结束之后结束。