【问题标题】:How to unnest an ARRAY of dates in Postgres?如何在 Postgres 中取消嵌套日期数组?
【发布时间】:2015-06-18 00:58:31
【问题描述】:

我想在下表中插入,但我无法转换日期数组。

CREATE TABLE schedule (
  idschedule serial NOT NULL,
  idzone integer NOT NULL,
  "time" timestamp without time zone NOT NULL,
  automatic boolean NOT NULL,
  idrecurrence character varying(20),
  duration integer,
  date date,
)

我正在尝试执行的INSERT

INSERT INTO schedule(idzone, "date", "time", duration, automatic) 
SELECT x, y, '20:00:00', '20', 'FALSE' 
FROM   unnest(ARRAY[3,4,5]) x
     , unnest(ARRAY[2015-4-12, 2015-4-19, 2015-4-26]) y

我收到以下错误:

错误:列“日期”是日期类型但表达式是整数类型

【问题讨论】:

    标签: arrays postgresql date integer unnest


    【解决方案1】:

    array literal 甚至比array constructor 更简单:

    '{2015-4-12, 2015-4-19}'::date[]
    

    使用 Postgres 9.4 或更高版本,有一种安全的方法可以并行取消嵌套两个数组:

    INSERT INTO schedule
          (idzone, "date", "time"    , duration, automatic) 
    SELECT x     , y     , '20:00:00', 20      , false
    FROM   unnest('{3, 4, 5}'::int[]
                , '{2015-4-12, 2015-4-19, 2015-4-26}'::date[]
                 ) AS t (x, y)  -- produces 3 rows
    

    见:

    除非您wanted 将一个数组的每个元素交叉连接到另一个数组的每个元素以产生 9 行的笛卡尔积。那么你原来的形式是对的。

    另外:从不使用保留字或基本类型名称(如“日期”和“时间”)作为标识符是一种很好的做法。

    【讨论】:

      【解决方案2】:

      正如错误消息所说,2015-4-12 不是日期。这是数字2015 减去数字4 减去数字12

      您可以将单个日期写为:

      '2014-04-12'::date
      

       date '2015-4-12'
      

      数组的更短形式(避免单独的强制转换)是:

      ARRAY['2015-4-12', '2015-4-19']::date[]
      

      【讨论】:

      • 我刚刚测试了解决方案 ARRAY['2015-4-12', '2015-4-19']::date[] 完美!谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-05
      • 2015-05-08
      • 1970-01-01
      • 1970-01-01
      • 2020-02-15
      • 1970-01-01
      相关资源
      最近更新 更多