MySQL检查给定的时间段是否在提供的时间段之间

时间:2016-09-29 06:46:57

标签: mysql sql pivot

我预约了一张预约表:

| id | user_id | guest_name | appointment_date | start_time | end_time |
|----|---------|------------|------------------|------------|----------|
| 1  | 1       | Abc        | 2016-09-30       | 13:00:00   | 13:30:00 |

考虑到名为" Abc"预约2016-09-30 13:0013:30 pm的约会预订,我想查看日期13:00-13:30上提供的时间段(即2016-09-30)不得与以下日期时间输入重叠。

| appointment_date | start_time | end_time |
|------------------|------------|----------|
| 2016-09-30       | 11:00      | 12:00    |
| 2016-09-30       | 12:30      | 13:00    |
| 2016-09-30       | 13:30      | 14:00    |
| 2016-09-30       | 14:00      | 14:30    |
| 2016-09-30       | 12:45      | 13:15    |
| 2016-09-30       | 13:15      | 13:45    |
| 2016-09-30       | 13:10      | 13:20    |
| 2016-09-30       | 13:00      | 13:25    |
| 2016-09-30       | 13:10      | 13:30    |
| 2016-09-30       | 13:00      | 13:30    |
| 2016-10-01       | 13:00      | 13:30    |

考虑到以下输入,您可能会看到以13:0013:30开头或结尾的广告位与约会预订表中的记录重叠。

简而言之,如果提供的输入的开始和结束时间与它们重叠,我想要一个从约会预订表返回记录的查询。

我试过以下:

SELECT * FROM appointments 
WHERE user_id = 1 
AND appointment_date = DATE('2016-09-30') 
AND (   (start_time = '11:00' AND end_time = '12:00') 
    OR 
    (start_time < '11:00' AND end_time > '12:00') 
    OR 
    (start_time > '11:00' AND end_time < '12:00') 
    OR (
    (start_time > '11:00' OR end_time < '11:00') 
    AND 
    (start_time < '12:00' OR end_time < '12:00'))
);

但不成功。有人知道怎么检查吗?

1 个答案:

答案 0 :(得分:1)

您可以使用以下查询:

SELECT DISTINCT t1.*
FROM appointments t1
JOIN dates t2 ON t1.appointment_date = t2.appointment_date AND
                 t1.start_time <= t2.end_time AND
                 t1.end_time >= t2.start_time

只要在另一个表中存在至少一个重叠记录,上述查询就会返回表appointments的记录。