1

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

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

我收到以下错误:

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

4

2 回答 2

6

数组文字甚至比数组构造函数更简单:

'{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 行的笛卡尔积。那么你的原始形式是正确的。

另外:最好不要使用保留字或基本类型名称(如“日期”和“时间”)作为标识符。

于 2015-04-12T20:58:18.843 回答
4

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

您可以将单个日期写为:

'2014-04-12'::date

或者

 date '2015-4-12'

数组的更短形式(避免单独的演员表)是:

ARRAY['2015-4-12', '2015-4-19']::date[]
于 2015-04-12T18:55:53.710 回答