【问题标题】:Represent date/time periods表示日期/时间段
【发布时间】:2017-11-27 16:23:37
【问题描述】:

我正在开发一个具有多种不同价格的预订平台。这些费率由一天中的时间、一周中的一天和一年中的一天决定。以下是所涉及的区间类型的一些示例:

  • 周一至周五,上午 9 点至下午 5 点
  • 周六和周日,上午 12 点至上午 9 点
  • 周六和周日,上午 9 点到下午 5 点
  • 周六和周日,下午 5 点至凌晨 12 点
  • 12 月 23 日和 24 日,随时
  • 12 月 26 日和 27 日,随时

表示这一点的最佳方式是什么,以便可以查询任何一天的不同有效汇率?

目前,我所做的方法是使用两个数组类型列,days_of_week[]hours_of_day[],用每个费率适用的天数/小时填充它们。考虑到像 12 月这样的特殊情况,我还有字段 valid_frominvalid_after,但是这需要每年都有一个新条目。

我已经查看了间隔的日期时间函数和here,但没有看到任何看起来可以解决这个问题的东西。

【问题讨论】:

  • 查看Range Types中的tstzrange。
  • tstzrange 看起来像是针对特定间隔的范围(例如 1 月 10 日至 20 日),而不是更通用的任何一个月的 10 日至 20 日
  • 和多个OR在哪里不起作用?

标签: sql postgresql date


【解决方案1】:

为什么不在 where 子句中列出它们呢?例如对于第一个样本:

t=# select now(),extract('dow' from now()) between 1 and 5 and now()::time between '09:00' and '17:00';
              now              | ?column?
-------------------------------+----------
 2017-11-27 16:56:01.544642+00 | t

所以您将(extract('dow' from now()) between 1 and 5 and now()::time between '09:00' and '17:00') 放在括号中,并在OR 上添加相同的括号...

您可以将它们全部添加到以 timestamptz 作为参数的函数中,并返回 true 或 false 以在 where 子句中使用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    相关资源
    最近更新 更多