sql - 在 postgresql 中获取空/打开时间范围
问题描述
我正在尝试在以下位置找到空缺的班次:
- 第一班从早上 6 点开始
- 最后一班在上午 12 点结束
IE:
给定以下数据/天:
start_time | end_time
-----------|---------
9 AM | 3 PM
5 PM | 10 PM
预期成绩:
start_time | end_time
-----------|---------
6 AM | 9 AM
3 PM | 5 PM
10 PM | 12 AM
这是我尝试过的,但它不起作用(我认为这与正确答案相去甚远)
SELECT *
FROM WORKERS_SCHEDULE
WHERE START_TIME not BETWEEN
ANY (SELECT START_TIME FROM WORKERS_SCHEDULE)
AND (SELECT START_TIME FROM WORKERS_SCHEDULE)
start_time
并且end_time
是数据类型TIME
。
解决方案
这是使用union all
和窗口函数的一种方法:
select *
from (
select '06:00:00'::time start_time, min(start_time) end_time from mytable
union all
select end_time, lead(start_time) over(order by start_time) from mytable
union all
select max(end_time), '23:59:59'::time from mytable
) t
where start_time <> end_time
彻底解释它是如何工作的有点复杂,但是:第一个联合查询计算早上 6 点和第一个班次开始之间的间隔,第二个子查询处理声明的班次,最后一个处理最后一个班次和午夜之间的间隔. 然后,外部查询过滤有间隙的记录。要了解它是如何工作的,您可以独立运行子查询,并查看开始和结束是如何调整的。
开始时间 | 时间结束 :--------- | :-------- 06:00:00 | 09:00:00 15:00:00 | 17:00:00 22:00:00 | 23:59:59
推荐阅读
- python - 如何在 python pandas 中添加趋势箭头?
- python - 使用 discord.py 从另一个 cog 导入函数
- ios - Xcode 签名错误 - 操作无法完成。(OSStatus 错误 -2147416032。)
- c# - 这里叫什么:return _()
- xcode - 任何为 react-native 应用程序(iOS 和 Android)自动增加内部版本号和构建版本的工具
- c - concerning about write function,
- android - Android multi-user: get current user info
- python-3.x - 如何在 gensim 模型中查找令牌的数量
- flutter - How can I add line numbers to TextField on Flutter?
- c++ - Windows 10 上已安装应用的列表