INTERVAL'0天'和'0天':: INTERVAL在postgres之间有什么区别?

Pra*_*ras 2 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 $$;
Run Code Online (Sandbox Code Playgroud)

在上面的查询中

SELECT DATE_TRUNC('DAYS', CURRENT_DATE) - date_interval :: INTERVAL;
Run Code Online (Sandbox Code Playgroud)

作品.但以下不起作用

SELECT (DATE_TRUNC('DAYS', CURRENT_DATE)) - (INTERVAL date_interval);
Run Code Online (Sandbox Code Playgroud)

基本上唯一的区别是date_interval :: INTERVAL vs INTERVAL date_interval

但是当我直接做INTERVAL'2天'这样的事情时它会起作用,但是当我使用变量时它会失败.

所以我的问题是双重的

  1. INTERVAL'2天'和'2天':: INTERVAL有什么区别?据我所知,两者都是类型转换.
  2. 为什么INTERVAL'2天'工作但是在使用变量时失败了

我确信我在遗漏引号时遗漏了一些相当明显的东西,但我不确定.任何帮助将不胜感激.

Lau*_*lbe 5

正如文档清楚地说明了语法

INTERVAL '0 days'
Run Code Online (Sandbox Code Playgroud)

是常量,也就是说,字符串必须是文字.

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