MySQL查询非重叠日期的聚合

时间:2015-05-21 15:52:19

标签: mysql date stream aggregate-functions overlapping

我们假设给出了以下数据流:

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进行过滤。

为了说明重叠日期,我在下面列出了图片。

enter image description here

黄色块表示数据在end_datetime列中具有正确的日期时间值。

ORANGE 块表示NULL列中的数据值为end_datetime

现在,SQL将实现第一,第二,第三和第四数据流的预期结果是什么? (注意:对于所有数据流,它必须是相同的SQL查询。因为每个数据流使用不同的SQL查询都没有意义)

0 个答案:

没有答案