开始时间‘22:00’ 结束时间‘3:00’

select time '22:00' - time '3:00' --result interval -18 h<br />
SELECT 24 -  (abs(extract(hour from time '1:00'  - time '22:00' ))) -- returns 3

终于到了 如何在知道‘3:00’[上限]的结束时间小于[下限]‘22:00’的情况下创建此时间范围

供参考

CREATE FUNCTION ext.time_subtype_diff(x time, y time) RETURNS float8 AS 
'SELECT EXTRACT(EPOCH FROM (x - y))' LANGUAGE sql STRICT IMMUTABLE;

CREATE TYPE ext.timerange AS RANGE (
    subtype = time,
    subtype_diff = time_subtype_diff
);

推荐答案

没有以time为基础的timerange range data type(当天,没有日期).最近的数字是tsrange,其中包括日期.最好始终使用timezone-aware变体:demo

select tstzrange('today'::date   +'22:00'::time,
                 'tomorrow'::date+'03:00'::time);
tstzrange
["2024-02-20 22:00:00+00","2024-02-21 03:00:00+00")

根据你打算用它做什么,你也可以 Select 你自己的create type,把它设置成你想要的range based on 103.这将自动创建它的多范围版本,并允许您访问所有built-in functions and operators, like @>:demo

create type ttzrange as range(subtype=timetz);
--above automatically creates `ttzmultirange` variant

create table test (tmr ttzmultirange);

insert into test 
select ttzmultirange(ttzrange('22:00','24:00'),ttzrange('00:00','05:00')) as ttzmr;

select ttzmr @> '01:00'::timetz as "is 1 o'clock in range" from test;
is 1 o'clock in range
t

你需要多范围才能让它们跨越"多天"--这并不是完全有效的解释,因为time应该不会意识到date.除了拥有内置可支配的巨大好处外,这还使您能够在您的范围内适应中午休息-跨越午夜的范围实际上是两个范围,一个是凌晨,一个是深夜到午夜,中间有很长的休息时间.


您也可以将值拆分到单独的字段中,或创建具有开始/结束time字段的普通非范围类型:

create type timerange as(start_time time, end_time time);
select ('22:00','03:00')::timerange;
row
(22:00:00,03:00:00)

出于某些目的,仅保持开始time和持续时间interval可能更容易:

create type timerange2 as(start_time time, duration interval);

这对遏制/重叠判断没有太大帮助(2点钟应该在第一个范围内,但假设日期没有差异,仍然是TOD和TOD,因为它不知道日期):

select (tr2), 
       (tr2).start_time, 
       (tr2).duration,
       (tr2).start_time+(tr2).duration as end_time,
       '02:00' between (tr2).start_time 
                   and (tr2).start_time+(tr2).duration as "2 o'clock in range"
from test2;
tr2 start_time duration end_time 2 o'clock in range
(22:00:00,05:00:00) 22:00:00 05:00:00 03:00:00 F
(04:00:00,01:30:00) 04:00:00 01:30:00 05:30:00 F

非范围方法迫使您"手动"模拟或重新实现内置的函数和运算符和/或处理范围界限.

Postgresql相关问答推荐

Postgs SQL用于比较两个表之间的数据并填充到目标中

PostgreSQL数据文件是否仅在判断点期间写入磁盘?

如何在Windows中安装sql for golang

如何高效地将行聚合到数组中,同时保留`NULL`来指示丢失的数据?

Postgres BULK INSERT如何影响Debezium?

此PostgreSQL汇总分组不适用于窗口表达式

PostgreSQL\d命令:有办法只 Select 一列吗?

为什么 Postgres 中的 now() 和 now()::timestamp 对于 CET 和 CEST 时区如此错误?

如何在 kubernetes 中安全地重启 postgresql 容器?

Postgres >= 和 <= 具有特殊字符的行为

statement_date列是日期类型,但表达式是整数类型

org.postgresql.util.PSQLException:错误:relation "app_user" does not exist

从没有行的计数中获取 0 值

如何语法判断 PostgreSQL 配置文件?

如何使用 PostgreSQL 触发器来存储更改(SQL 语句和行更改)

ruby on rails jsonb 列默认值

在子类的 Hibernate 中 for each 表指定不同的序列

GRANT SELECT 特权使用一个语句对所有序列

在 OS X 上使用 Postgres.app 时如何将 psql 放在路径上?

postgres LISTEN/NOTIFY rails