我们假设给出了以下数据流:
CREATE TABLE reservation (
id bigint(20),
start_datetime DATETIME NOT NULL,
end_datetime DATETIME
);
1。第一个数据流
INSERT INTO reservation (id, start_datetime, end_datetime) VALUES
(1, '2015-05-01 00:00:00', '2015-05-03 00:00:00'),
(2, '2015-05-02 00:00:00', '2015-05-05 00:00:00'),
(3, '2015-05-03 00:00:00', '2015-05-04 00:00:00'),
(4, '2015-05-05 00:00:00', '2015-05-07 00:00:00');
对于第一个插入值id = 1,2,3和4.我需要获得“总预留索引”。预期结果将是:
+------+-------------------------+---------------------+---------------------+
| id | Total Reservation Index | start_datetime | end_datetime |
+------+-------------------------+---------------------+---------------------+
| 1 | 2 | 2015-05-01 00:00:00 | 2015-05-03 00:00:00 |
| 4 | 2 | 2015-05-05 00:00:00 | 2015-05-07 00:00:00 |
+------+-------------------------+---------------------+---------------------+
2。第二个数据流
INSERT INTO reservation (id, start_datetime, end_datetime) VALUES
(5, '2015-05-04 00:00:00', null),
(6, '2015-05-02 00:00:00', null),
(7, '2015-05-05 00:00:00', null),
(8, '2015-05-01 00:00:00', null);
您会注意到end_datetime是NULL
。表预订的业务逻辑意味着,预订将永远打开。因此,通过使用与第一个数据流相同的查询,结果如下:
+------+-------------------------+---------------------+---------------------+
| id | Total Reservation Index | start_datetime | end_datetime |
+------+-------------------------+---------------------+---------------------+
| 1 | 2 | 2015-05-01 00:00:00 | 2015-05-03 00:00:00 |
| 5 | 5 | 2015-05-04 00:00:00 | 2015-05-08 00:00:00 |
+------+-------------------------+---------------------+---------------------+
请注意,id = 4
已更改为id = 5
。因此,如果我们对“总保留索引”列进行SUM操作,则总索引为7(或2 + 5)。
第3。第三个数据流
INSERT INTO reservation (id, start_datetime, end_datetime) VALUES
(9, '2015-05-04 00:00:00', '2015-05-04 00:00:00'),
(10, '2015-05-05 00:00:00', '2015-05-07 00:00:00'),
(11, '2015-05-01 00:00:00', '2015-05-07 00:00:00');
对于第三个数据流,我们将使用相同的查询..预期结果将与第二个数据流的结果相同。它将返回2 rows => id 1 and 5
。
4。第四个数据流
INSERT INTO reservation (id, start_datetime, end_datetime) VALUES
(12, '2015-05-07 00:00:00', null);
在第四个数据流中,它将具有与第二个数据流相同的结果。它将返回2 rows => id 1 and 5
。
当前尝试
我目前的尝试是使用此
select id, datediff('2015-05-08', start_datetime) as 'Total Reservation Index', start_datetime, end_datetime from reservation where start_datetime < end_datetime or end_datetime is null and start_datetime >= '2015-05-01' and end_datetime <= '2015-05-08' order by start_datetime asc;
修改
对不起'2015-05-08'的混乱。 '2015-05-08'来自最终过滤日期。就像我在下面的问题中提出的那样。它确实有过滤器start_date和end_date。因此,“2015-05-08”预期的值可以欺骗/替换NULL
列中的end_datetime
值。
此外,对于NULL
列中的任何给定end_datetime
数据,它将替换结束过滤日期。最终过滤日期可以是“2015-05-10”或“2015-05-11”,但当然会有不同的查询结果。
但是,上面的查询没有按预期进行。由于我需要排除重叠日期,我还需要根据start_datetime和end_datetime进行过滤。
为了说明重叠日期,我在下面列出了图片。
黄色块表示数据在end_datetime
列中具有正确的日期时间值。
ORANGE 块表示NULL
列中的数据值为end_datetime
。
现在,SQL将实现第一,第二,第三和第四数据流的预期结果是什么? (注意:对于所有数据流,它必须是相同的SQL查询。因为每个数据流使用不同的SQL查询都没有意义)