Система бронирования удаляет все сохраненные заказы в течение периода - PullRequest
1 голос
/ 27 мая 2019

У меня есть несколько заказов в состоянии ожидания.Но 1 из них оплачен и статус подтвержден.

Вот пример того, что у меня есть:

id |       start_date       |        end_date       |  status
   |                        |                       |
1  |   2019-06-10 08:00:00  |  2019-06-10 20:00:00  |  pending    <-- To delete
2  |   2019-06-10 10:00:00  |  2019-06-10 13:00:00  |  confirmed
3  |   2019-06-09 06:00:00  |  2019-06-11 11:00:00  |  pending    <-- To delete
4  |   2019-06-10 21:00:00  |  2019-06-10 22:00:00  |  pending    <-- Keep it
5  |   2019-06-10 11:00:00  |  2019-06-10 12:00:00  |  pending    <-- To delete

Идентификатор 2 подтвержден, и мне нужно удалить все другие бронирования в состоянии ожидания, которые находятся в том же периоде подтвержденного статуса.

Так что мне нужно удалить идентификаторы 1, 3 и 5

Как это сделать с помощью SQL-запроса?

Я думал об этом, но не уверен, что он охватит все возможные случаи:

DELETE FROM booking 
WHERE status = 'pending' 
AND start_date <= '2019-06-10 10:00:00' 
AND end_date >= '2019-06-10 13:00:00'

Ответы [ 2 ]

2 голосов
/ 27 мая 2019

Я думаю, вам нужны перекрывающиеся интервалы.Это может быть:

DELETE b
    FROM booking b
    WHERE b.status = 'pending' AND
          b.end_date >= '2019-06-10 10:00:00' AND
          b.start_date <= '2019-06-10 13:00:00';

Два интервала перекрываются, если второй заканчивается или начинается после первого, а второй начинается или заканчивается первым.

1 голос
/ 27 мая 2019
DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id SERIAL PRIMARY KEY
,start_date DATETIME NOT NULL
,end_date DATETIME NOT NULL
,status VARCHAR(12) NOT NULL
);

INSERT INTO my_table VALUES
(1,'2019-06-10 08:00:00','2019-06-10 20:00:00','pending'),
(2,'2019-06-10 10:00:00','2019-06-10 13:00:00','confirmed'),
(3,'2019-06-09 06:00:00','2019-06-11 11:00:00','pending'),
(4,'2019-06-10 21:00:00','2019-06-10 22:00:00','pending'),
(5,'2019-06-10 11:00:00','2019-06-10 12:00:00','pending');

DELETE y 
  FROM my_table x 
  JOIN my_table y 
    ON y.start_date <= x.end_date 
   AND y.end_date > x.start_date 
 WHERE x.status = 'confirmed' 
   AND y.id <> x.id;

Query OK, 3 rows affected (0.00 sec)

SELECT * FROM my_table;
+----+---------------------+---------------------+-----------+
| id | start_date          | end_date            | status    |
+----+---------------------+---------------------+-----------+
|  2 | 2019-06-10 10:00:00 | 2019-06-10 13:00:00 | confirmed |
|  4 | 2019-06-10 21:00:00 | 2019-06-10 22:00:00 | pending   |
+----+---------------------+---------------------+-----------+
2 rows in set (0.00 sec)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...