sql - tsrange计算时间间隔?
问题描述
我有一张预留房间的桌子:
CREATE TABLE reservation (room int, during tsrange);
INSERT INTO reservation VALUES
(1108, '[2010-01-01 09:30, 2010-01-01 10:30)');
问题:
我需要获得这个房间的剩余免费时间间隔:白天(09:00 - 18:00)的 30 分钟、45 分钟、1 小时和 1.30 分钟。怎么做?谢谢大家。
解决方案
以下查询将返回在 中有条目的所有日期的所有空闲时间间隔reservation
:
WITH mins(lt) AS (
/* get all lower bounds of intervals */
SELECT lower(during)
FROM reservation
UNION
/* get 18:00 for each day */
SELECT date_trunc('day', lower(during)) + INTERVAL '18 hours'
FROM reservation
), maxs(ut) AS (
/* get all upper bounds of intervals */
SELECT upper(during)
FROM reservation
UNION
/* get 09:00 for each day */
SELECT date_trunc('day', lower(during)) + INTERVAL '9 hours'
FROM reservation
)
SELECT tsrange(ut, lt) /* candidate for a free interval */
FROM mins
JOIN maxs
ON date_trunc('day', lt) = date_trunc('day', ut)
AND ut < lt
/* exclude all such intervals that overlap an entry */
WHERE NOT EXISTS (SELECT 1 FROM reservation
WHERE during && tsrange(ut, lt, '()'))
ORDER BY ut;
按长度过滤它们留给读者作为练习。
推荐阅读
- asp.net - 如何在 ASP.Net 应用程序的 react.js 前端处理身份验证状态
- ruby - Ruby Nokogiri 抓取数据 URL
- django - Django 为管理员和员工用户建模清洁方法
- c++ - Makefile 创建两个库 - 一个依赖于另一个
- android - android NDK致命错误:stdio.h:没有这样的文件或目录#include
- java - Java 盒子的最大体积 --objects/array
- vue.js - 通过 Vue Computed Setter 调用 Vuex Action
- javascript - 未设置本机基本输入参考
- winforms - SharpGL - 用网格绘制球体并为每个球体附加颜色
- ffmpeg - FFMPEG - 将像素格式从 24 位 RGB 更改为 8 位灰度只会改变颜色,但不会改变文件大小