2017-09-25 92 views
0

我在MySQL中有一个时间分配表。在我推新记录之前,我需要检查它是否与现有日期和时间段重叠。如何检查表(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年1月1日和2017年1月2日,小时,1时00分至02:00被分配在这两天。

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

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 

我无法撰写满足所有条件的查询。 请帮助我检查重叠记录在db中,我的输入是$ start_date,$ end_date,$ start_time和$ end_time。

+1

听起来像是你有一个查询satifies大多数或至少一些条件。你可以分享它。 – GolezTrol

回答

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 | 
+--------+-------------------------+-------------------------+------------------+------------------+---------+