I have a Postgres table with a schema that looks like this –
Table "public.nav_due_dates" Column | Type | Collation | Nullable | Default ----------+---------+-----------+----------+----------------------------------------------- nav_id | integer | | not null | nextval('nav_due_dates_nav_id_seq'::regclass) fund_id | integer | | | listdate | date[] | | |
I have a SELECT
statement that will generate all the days of the year… and eventually after joining against a weekends and holiday table I want filter out all the business days to insert those dates values into the listdate
date[] array column. At the moment I’m using the below to generate rows with all the days of the year:
SELECT i::date from generate_series('2021-01-01', '2021-12-31', '1 day'::interval) i;
So far I’ve tried to do the insert like so –
INSERT INTO nav_due_dates(fund_id, listdate) VALUES (100, ( SELECT i::date from generate_series('2021-01-01', '2021-12-31', '1 day'::interval) i)::date[] ) ;
And this is the error it gives me –
ERROR: cannot cast type date to date[] LINE 3: '2021-12-31', '1 day'::interval) i)::date[] ) ^
Is there a good way to do this?
Advertisement
Answer
You need to aggregate the values into an array, either using array_agg()
:
INSERT INTO nav_due_dates(fund_id, listdate) VALUES (100, (SELECT array_agg(i::date) from generate_series('2021-01-01','2021-12-31', '1 day'::interval) i) ) ;
Or using the array()
constructor:
INSERT INTO nav_due_dates(fund_id, listdate) VALUES (100, array(SELECT i::date from generate_series('2021-01-01','2021-12-31', '1 day'::interval) i) ) ;