【问题标题】:Postgres Custom Range TypePostgres 自定义范围类型
【发布时间】:2015-01-19 04:19:00
【问题描述】:

问题:

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

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

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

背景:

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

  • $100 周一 0900-1800
  • $200 星期一 1800-2200
  • $500 星期一 2200-0000

为了支持这一点,我正在研究的解决方案如下(任何关于更好的方法的想法都非常感谢)

我想创建一个包含“fee_rules”的表格。我希望能够查找给定的日期、时间和持续时间,并能够根据一组基于范围的费用规则检查相关费用。我建议的表架构:

  • id 序列
  • day_of_week 整数 [其中 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 表示“星期一”)并根据建议访问的 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]

【问题讨论】:

标签: postgresql date types range


【解决方案1】:

根据@a_horse_with_no_name 和@pozs “我认为你不需要 subtype_diff”:

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'

【讨论】:

    猜你喜欢
    • 2017-09-06
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多