如何在 postgresql 中声明变量 INTERVAL?
How to declare a variable INTERVAL in postgresql?
我想编写一个代码,使用变量 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);
我假设我做错了什么,但谷歌搜索文档并没有给我答案。这个问题的正确步骤是什么?
一个变量只能保存底层数据类型的完整值。您也不能仅将 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);
...
我想编写一个代码,使用变量 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);
我假设我做错了什么,但谷歌搜索文档并没有给我答案。这个问题的正确步骤是什么?
一个变量只能保存底层数据类型的完整值。您也不能仅将 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);
...