如何在Postgresql中声明变量INTERVAL?

时间:2018-12-07 12:29:00

标签: postgresql datetime timestamp plpgsql intervals

我想编写一个代码,该代码使用变量INTERVAL从TIMESTAMP_START插入到TIMESTAMP_END。 我的硬编码工作代码如下:

LOOP 
    ...DO SMTH...

    TIMESTAMP_START := (TIMESTAMP_START + INTERVAL '30' MINUTE);
    EXIT WHEN TIMESTAMP_START > TIMESTAMP_END;
END LOOP; 

当我尝试替换间隔的类型时,出现语法错误:

DECLARE INCREMENT_TYPE  INTERVAL := minute;
...
TIMESTAMP_START := (TIMESTAMP_START + INTERVAL '30' INCREMENT_TYPE);

当我尝试改变步骤时也会发生同样的事情:

DECLARE STEP    text    := '30'; 
...
TIMESTAMP_START := (TIMESTAMP_START + INTERVAL STEP MINUTE);

我假设自己做错了事,但是仔细阅读文档并没有给我答案。解决此问题的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

变量只能保存基础数据类型的完整值。您也不能只将2018存储在时间戳变量中。

根据您要使用它的方式以及它的灵活程度,我看到以下可能性:

declare 
   increment_value  interval := interval '30' minute;

begin
...
   timestamp_start := (timestamp_start + increment_value);
...

如果只定义一次增量值,那将很有帮助。


如果要在整个函数中使用不同的间隔长度,则可以定义一个标准长度的间隔,然后将其相乘:

declare 
   one_minute_interval interval := interval '1' minute;
   one_hour_interval interval := interval '1' hour;

begin
...
   timestamp_start := (timestamp_start + 30 * one_minute_interval);
...
   timestamp_start := (timestamp_start + 5 * one_hour_interval);

或者更接近您要尝试的解决方案:

declare 
   increment_type  text := 'minute';

begin
...
   timestamp_start := (timestamp_start + ('30 '||increment_type)::interval);
...