【问题标题】:How to check time allotment overlap in table (mysql)?如何检查表(mysql)中的时间分配重叠?
【发布时间】:2017-09-25 10:36:11
【问题描述】:

我在 mysql 中有一个时间分配表。在我将新记录推送到其中之前,我需要检查它是否与现有日期和时间段重叠。

db 中的示例数据如下

Start Date   End Date   | Start Time | End Time
2017-01-01 | 2017-01-01 | 10:00      | 11:00 
2017-01-01 | 2017-01-01 | 08:00      | 09:00
2017-01-01 | 2017-01-02 | 01:00      | 02:00

最后一条记录表示 2017-01-01 和 2017-01-02,这两天都分配了 01:00 到 02:00 的时间。

以下是我将尝试推送的一些示例记录。预期结果显示为最后一列。 我需要运行查询并确保这些记录不会在 db 中重叠。

Start Date   End Date   | Start Time  End Time
2017-01-01 | 2017-01-01 | 01:30      | 01:31 | OVERLAP
2017-01-02 | 2017-01-02 | 01:30      | 01:31 | OVERLAP
2017-01-01 | 2017-01-02 | 01:30      | 01:31 | OVERLAP
2017-01-01 | 2017-01-02 | 00:30      | 00:31 | PASS
2017-01-03 | 2017-01-03 | 00:30      | 00:31 | PASS
2016-12-30 | 2017-01-04 | 01:30      | 01:31 | OVERLAP
2016-12-30 | 2016-12-30 | 00:30      | 00:31 | PASS

我无法编写满足所有条件的查询。 请帮助我查询以检查数据库中的重叠记录,我的输入是 $start_date、$end_date、$start_time 和 $end_time。

【问题讨论】:

  • 听起来您确实有一个满足大多数或至少某些条件的查询。你不妨分享一下。

标签: php mysql sql


【解决方案1】:

我提出了这个问题。请用更多的值检查它。我是在 MSSQL 上做的,但对 Mysql 应该是一样的。如有任何问题,请与我联系。

 SELECT A.ID, A.START_DATE, A.END_DATE, A.START_TIME, A.END_TIME
, CASE WHEN B.START_DATE IS NULL THEN 'PASS' ELSE 'OVERLAP' END AS CHK
, B.START_DATE,B.END_DATE, B.START_TIME, B.END_TIME
FROM NEW_RECORDS A
LEFT JOIN EXISTING_RECORDS B ON A.START_DATE <=B.END_DATE 
   AND A.END_DATE>=B.START_DATE
   AND A.START_TIME<=B.END_TIME 
   AND A.END_TIME>=B.START_TIME

输出:

+--------+-------------------------+-------------------------+------------------+------------------+---------+
|     ID |       START_DATE        |        END_DATE         |    START_TIME    |     END_TIME     |   CHK   |
+--------+-------------------------+-------------------------+------------------+------------------+---------+
|      1 | 2017-01-01 00:00:00.000 | 2017-01-01 00:00:00.000 | 01:30:00.0000000 | 01:31:00.0000000 | OVERLAP |
|      2 | 2017-01-02 00:00:00.000 | 2017-01-02 00:00:00.000 | 01:30:00.0000000 | 01:31:00.0000000 | OVERLAP |
|      3 | 2017-01-01 00:00:00.000 | 2017-01-02 00:00:00.000 | 01:30:00.0000000 | 01:31:00.0000000 | OVERLAP |
|      4 | 2017-01-01 00:00:00.000 | 2017-01-02 00:00:00.000 | 00:30:00.0000000 | 00:31:00.0000000 | PASS    |
|      5 | 2017-01-03 00:00:00.000 | 2017-01-03 00:00:00.000 | 00:30:00.0000000 | 00:31:00.0000000 | PASS    |
|      6 | 2016-12-30 00:00:00.000 | 2017-01-04 00:00:00.000 | 01:30:00.0000000 | 01:31:00.0000000 | OVERLAP |
|      7 | 2016-12-30 00:00:00.000 | 2016-12-30 00:00:00.000 | 00:30:00.0000000 | 00:31:00.0000000 | PASS    |
+--------+-------------------------+-------------------------+------------------+------------------+---------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多