Postgres 檔案說有一個內置的 daterange 型別,但是當我在 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']);
該函式編譯但在呼叫時拋出錯誤:
“[”處或附近的語法錯誤
什么叫正確?
還是應該將它們作為字串傳遞,然后在函式內部進行決議/轉換/轉換?
uj5u.com熱心網友回復:
如手冊中所述,創建范圍的語法是將范圍型別名稱用作“創建者”函式,例如創建一個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', '[]');
uj5u.com熱心網友回復:
a_horse 已經為函式呼叫提供了正確的語法。
或者,傳遞文字常量。這應該適用于每個客戶:
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 函式并在其中構造范圍通常更簡單。
無論哪種方式,都要清楚包含哪些界限。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/467256.html
標籤:sql PostgreSQL 功能 日期范围 海狸