【发布时间】: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]
【问题讨论】:
-
我认为你不需要
subtype_diff: sqlfiddle.com/#!15/cc2ef/1 -
subtype_diff仅帮助 PostgreSQL 构建更好的 GiST(和 SP-GiST)索引,您可能根本不需要。 postgresql.org/docs/current/static/… -- 如果你真的需要它,它必须是一个函数,它必须接受两个子类型类型的值作为参数,并返回一个表示两个给定值之间差异的双精度值。 postgresql.org/docs/current/static/sql-createtype.html -
感谢@a_horse_with_no_name,您愿意将您的回复作为答案吗?否则我可以这样做并将其标记为社区维基?谢谢
标签: postgresql date types range