如何将日期范围传递给 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 函数并在其中构造范围通常更简单。
无论哪种方式,都要清楚要包括哪些范围。
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 函数并在其中构造范围通常更简单。
无论哪种方式,都要清楚要包括哪些范围。