【问题标题】:Inserting a generate_series select date statement into an array column将 generate_series 选择日期语句插入数组列
【发布时间】:2021-04-13 15:03:50
【问题描述】:

我有一个 Postgres 表,其架构看起来像这样 -

                              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[]  |           |          | 

我有一个 SELECT 语句,它将生成一年中的所有日子......最终在加入周末和假期表之后,我想过滤掉所有工作日以将这些日期值插入到 listdate date[] 数组列。目前,我正在使用以下内容生成一年中所有日期的行:

SELECT i::date from generate_series('2021-01-01', 
 '2021-12-31', '1 day'::interval) i;

到目前为止,我已经尝试过像这样插入 -

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[] )
;

这就是它给我的错误-

ERROR:  cannot cast type date to date[]
LINE 3:   '2021-12-31', '1 day'::interval) i)::date[] )
                                             ^

有什么好办法吗?

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    您需要使用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) )
    ;
    

    或者使用array()构造函数:

    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) )
    ;
    

    【讨论】:

    • 非常感谢!在您发布答案之前,我已经发现了有关 array_agg 的信息,但我似乎无法获得正确的语法!
    猜你喜欢
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    相关资源
    最近更新 更多