Postgres自定义范围类型

时间:2015-01-19 04:19:01

标签: postgresql date types range

问题:

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

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

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

背景:

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

  • $ 100 monday 0900-1800
  • 周一1800-2200美元
  • $ 500 monday 2200-0000

为了支持这一点,我正在研究的解决方案如下(任何关于如何更好地采取这种方式的想法)

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

  • id sequence
  • 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]

1 个答案:

答案 0 :(得分:3)

per @a_horse_with_no_name和@pozs &#34;我认为你不需要subtype_diff&#34;:

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'