如何在 Postgres 中存储日期范围数组?

How to store an array of date ranges in Postgres?

我正在尝试建立一个时间表,我在客户端生成了一个包含日期范围的对象数组

[ 
    {start: "2020-07-06 0:0", end: "2020-07-10 23:59"}, 
    {start: "2020-07-13 0:0", end: "2020-07-17 23:59"} 
]

我有一个类型为 daterange[] 的列,格式化此数据以将其插入我的 table 的正确方法是什么?

这是我目前拥有的:

INSERT INTO schedules(owner, name, dates) VALUES (
    1, 
    'work', 
    '{
         {[2020-07-06 0:0,2020-07-10 23:59]},
         {[2020-07-13 0:0,2020-07-17 23:59]}
    }'
)

我想你想要:

insert into schedules(owner, name, dates) values (
    1, 
    'work', 
    array[ 
        '[2020-07-06, 2020-07-11)'::daterange, 
        '[2020-07-13, 2020-07-18)'::daterange 
    ]
);

理由:

  • 你正在使用 dateranges,所以你不能有时间部分(为此,你需要 tsrange);正如您的代码所代表的那样,您似乎想要一个包容性下限和一个独占性上限(因此 [ 在左侧, ) 在右侧)

  • 需要显式转换,以便 Postgres 可以识别数组元素具有正确的数据类型(否则,它们看起来像 text

  • 然后,您可以用 array[] 构造函数

    包围范围列表

Demo on DB Fiddle:

owner | name | dates                                                
----: | :--- | :----------------------------------------------------
    1 | work | {"[2020-07-06,2020-07-11)","[2020-07-13,2020-07-18)"}