postgresql Postgres自定义范围类型

w8ntj3qf  于 2023-03-01  发布在  PostgreSQL
关注(0)|答案(2)|浏览(140)
    • 问题:**

如何使用时间(或带有tz的时间)作为基础创建自定义范围类型?目前为止我所拥有的:

create time timerange as range (
    subtype = time,
    subtype_diff = ??? )

我认为subtype_diff需要一个函数,对于pg中的时间类型,minus函数(difference)应该可以工作,但是我似乎找不到描述正确语法的文档。

    • 背景:**

我正在尝试开发一个日程安排应用程序,服务供应商可以显示他们在一天中不同时间的可用性和费用,客户可以实时查看价格和预订。服务供应商需要能够为不同的日期或时间设置不同的价格。例如,一个水管工可能希望在一个小时的访问:

  • 100美元星期一09:00 - 18:00
  • 200美元星期一18时至22时
  • 星期一500美元2200 - 0000

为了支持这一点,我正在研究的解决方案如下(任何关于更好的方法的想法都被感激地接收)
我想创建一个包含"fee_rules"的表。我希望能够查找给定的日期、时间和持续时间,并能够根据一组基于范围的费用规则检查相关费用。我建议的表架构:

  • id序列
  • 星期几整数[其中0 =星期日,1 =星期一..]
  • time_range [我只想使用以下命令创建一个自定义时间范围

小时:分钟]

  • 整数费用
  • fee_schedule_id(外键)(对特定供应商的引用,该供应商是该特定费用规则的"所有者")

费用规则的示例如下:

id     day_of_week    time_range     fee   fee_schedule_id

12     01              10:00-18:00   100   543

对于给定的日期,我计划计算day_of_week(例如day_of_week=01表示"Monday"),并根据计划访问的start_time和持续时间生成time_range,例如visit_range=10:00-11:00。我希望能够使用postgresql的范围操作符进行搜索,例如:

select fee where day_of_week = '01' and visit_range <@ (range is contained by)time_range and fee_schedule_id = 543 [reference to the specific supplier's fees]
3qpi33ja

3qpi33ja1#

根据@a_horse_with_no_name和@pozs“我认为您不需要子类型差异”:

create type timerange as range (subtype = time);

create table schedule 
(
  id integer not null primary key,
  time_range timerange
);

insert into schedule 
values
(1, timerange(time '08:00', time '10:00', '[]')),
(2, timerange(time '10:00', time '12:00', '[]'));

select *
from schedule
where time_range @> time '09:00'
kulphzqa

kulphzqa2#

timerange的subtype_diff实际上是Postgres文档的一个示例(从9.5版本开始):

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

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

相关问题