【发布时间】:2016-04-14 14:37:24
【问题描述】:
我有两个日期check_in 和check_out 的记录,我想知道多人同时签到的范围。
所以,如果我有以下签入/结账:
- A 人:
1PM - 6PM - B 人:
3PM - 10PM - C 人:
9PM - 11PM
我想得到3PM - 6PM(A 和 B 的重叠)和9PM - 10PM(B 和 C 的重叠)。
我可以用代码编写一个算法在线性时间内执行此操作,是否也可以通过PostgreSQL 的线性时间关系查询来执行此操作?
它需要有一个最小的响应,这意味着没有重叠的范围。因此,如果有一个结果给出了6PM - 9PM 和8PM - 10PM 的范围,那将是不正确的。它应该返回6PM - 10pm。
【问题讨论】:
-
您的 Postgres 版本、您的确切表定义(完整的
CREATE TABLE脚本,包括所有约束或您在 psql 中使用\d tbl获得的内容)和一些示例数据会很不错。 -
是的,版本会帮助我们回答,最近的版本添加了可能适用的新日期范围功能。
-
我想解决方案将涉及窗口函数和可能的递归 CTE
标签: sql postgresql relational-database window-functions gaps-and-islands