如何将日期范围传递给 Postgres 函数?

How to pass daterange to Postgres functions?

Postgres documentation 说有一个内置的日期范围类型,但是当我在 DBeaver 中编写函数时它似乎不起作用。它没有突出显示或识别。

我需要将 [2018-01-01, 2018-2-28] 格式的 2 个日期范围传递给 Postgres 函数以进行范围提取等

声明:

create or replace function extract_range(outer_range daterange, inner_range daterange);

通话:

select extract_range(['2018-01-01', '2018-12-31'], ['2018-03-01', '2018-3-31']);

函数编译但在调用时抛出错误:

syntax error at or near "["

正确的叫法是什么?

或者我应该将它们作为字符串传递,然后在函数内部 parse/convert/cast 传递?

As documented in the manual 创建范围的语法是使用范围类型名称作为“创建者”函数,例如要创建 daterange,您必须使用:

daterange('2018-01-01', '2018-12-31', '[]') 

第三个参数定义边是包含的还是排他的。你没有在那里指定你想要什么。

所以你需要:

select extract_range(daterange('2018-01-01', '2018-12-31', '[]'),
                     daterange('2018-03-01', '2018-03-31', '[]');

a_horse 已经提供 .

或者,传递 literal constants。这应该适用于每个客户:

SELECT extract_range('[2018-01-01,2019-01-01)'
                   , '[2018-03-01,2019-03-31)');

如果您不确定语法,请询问 Postgres(使用 psql 的示例):

test=> SELECT daterange('2018-01-01', '2018-12-31', '[]');
        daterange        
-------------------------
 [2018-01-01,2019-01-01)
(1 row)

为了绝对清楚,您可以添加显式类型转换:

SELECT extract_range('[2018-01-01,2019-01-01)'::daterange
                   , '[2018-03-01,2019-04-01)'::daterange);

但这是可选的,而函数类型解析不会 运行 与重载函数混淆。

请注意,默认 daterange 值包括下限 ([) 并排除上限 ())。

是的,将基本类型传递给 Postgres 函数并在其中构造范围通常更简单。

无论哪种方式,都要清楚要包括哪些范围。