【问题标题】:Preserving lower/upper bound for Range data type保留 Range 数据类型的下限/上限
【发布时间】:2021-05-31 16:55:33
【问题描述】:

以下面的查询为例

WITH dummy(x) AS (
    SELECT '[2018-12-01, 2019-01-15]'::daterange
)
SELECT lower(x), upper(x) FROM dummy

这给了

   lower    |   upper
------------+------------
 2018-12-01 | 2019-01-16

插入文字的上限是2019-01-15,但是当我检索它时,上限神奇地变成了2019-01-16。如何保留原始边界?

【问题讨论】:

  • 你不能 - this is documented in the manual "内置范围类型 int4range、int8range 和 daterange 都使用包含下限但不包括上限的规范形式;即, [)"
  • 你所能做的就是测试上限是否包含SELECT upper_inc('[2018-12-01, 2019-01-15]'::daterange); f

标签: sql postgresql range date-range sqldatatypes


【解决方案1】:

正如顶部评论明智地指出的那样,the document

内置范围类型int4rangeint8rangedaterange都使用包含下限但不包括上限的规范形式;即[)

这意味着如果数据存储在Range 中,则无法保留原始边界。但是,如果您不介意更改架构,您可以按原样存储边界并让 PostgreSQL 为您生成 Range

create table foo (
    ...

    begin_date date      not null,
    end_date   date      not null,
    period     daterange not null generated always as ( daterange(begin_date, end_date, '[]') ) stored,

    ...
)

这样begin_dateend_date 将忠实地存储它们的原始值,并且由于生成了Range 列,表将保持向后兼容。

【讨论】:

    猜你喜欢
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    相关资源
    最近更新 更多