postgres中的INTERVAL'0 days'和'0 days':: INTERVAL有什么区别

时间:2018-08-03 12:28:00

标签: postgresql

我正在尝试使用循环在psql中创建包含日期列表的基本表。代码如下所示

DO $$

DECLARE counter       INTEGER :=0;
    date_interval VARCHAR(250) :='0 DAYS';

BEGIN


  DROP TABLE IF EXISTS temp_dates;
  CREATE TABLE temp_dates (
    date DATE
  );

  WHILE counter < 12 LOOP

    date_interval := counter || ' DAYS';

    INSERT INTO temp_dates
    --SELECT DATE_TRUNC('DAYS', CURRENT_DATE) - date_interval :: INTERVAL;
      SELECT (DATE_TRUNC('DAYS', CURRENT_DATE)) - (INTERVAL date_interval);

    counter := counter + 1;
END LOOP;

END $$;

在上面的查询中

SELECT DATE_TRUNC('DAYS', CURRENT_DATE) - date_interval :: INTERVAL;

有效。但是以下方法不起作用

SELECT (DATE_TRUNC('DAYS', CURRENT_DATE)) - (INTERVAL date_interval);

基本上唯一的区别date_interval :: INTERVAL与INTERVAL date_interval

但是当我直接执行类似INTERVAL'2 days'的操作时,它会起作用,但是当我使用变量时,它会失败。

所以我的问题是两个方面

  1. INTERVAL“ 2天”和“ 2天” :: INTERVAL之间有什么区别。据我了解,两者都是类型转换。
  2. 为什么INTERVAL'2 days'工作,但是使用变量时失败

我肯定在转义引号时缺少明显的东西,但是我不确定。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:5)

the documentation清楚地说明了语法

INTERVAL '0 days'

用于常量,也就是说,字符串必须是文字。

它不是'0 days'::interval之类的类型转换的语法,它允许您更改任意表达式的类型。