sql - 选择重叠日期的语句
问题描述
我需要一个 SELECT 查询,它返回日期相互重叠的行的 RoomID,例如。客户 ID 10 和 6 在不同的日期到达,但他们在酒店逗留期间被分配到同一个房间。
RoomID ArrivalDate DepartureDate ClientID
2 2020-11-02 2021-11-10 10
2 2021-11-01 2021-11-11 6
4 2021-10-18 2021-10-20 4
4 2021-12-13 2021-12-21 11
4 2021-12-14 2021-12-21 12
8 2021-12-10 2021-12-19 8
9 2021-09-20 2021-09-25 2
9 2021-09-21 2021-09-25 1
9 2021-12-10 2021-12-15 7
10 2021-10-19 2021-10-26 5
11 2021-10-02 2021-10-10 3
11 2021-12-12 2021-12-18 9
12 2021-10-04 2021-10-09 2
CREATE DATABASE Hotel;
CREATE TABLE reservations (
roomID INT NOT NULL,
ArrivalDate DATE NOT NULL,
DepartureDate DATE NOT NULL,
clientID INT NOT NULL,
PRIMARY KEY (roomID, ArrivalDate),
CHECK (ArrivalDate <= DepartureDate)
);
我很感激任何帮助。
解决方案
您可以使用以下方法获得重叠exists
:
select t.*
from t
where exists (select 1
from t t2
where t2.RoomID = t.RoomId and
t2.ClientID <> t.ClientId and
t2.ArrivalDate < t.DepartureDate and
t2.DepartureDate > t.ArrivalDate
);
推荐阅读
- django - 如何使导入导出保存 JSONField 不作为字符串
- pandas - 按 ID 和日期合并行 - Pandas
- odoo - 对具有相同产品的数量行进行分组和求和
- ios - 我可以在没有通知权限的情况下使用 FCM 接收消息吗?
- next.js - 使用 Next.js 进行砌体布局
- javascript - 如何将文档的最大高度限制为 100% 并用剩余高度填充最后一个孩子?
- r - TaskscheduleR 作业返回 fetch.write_memory 错误,但在虚拟机上的 RStudio 中作为本地作业工作
- bash - 在 shell 脚本中将 ftp 更改为 sftp
- javascript - DatGui & Three.js 不合作
- linux - 退出后任务从cgroup中移除