Sql 使用表中的值的Postgres间隔

Sql 使用表中的值的Postgres间隔,sql,postgresql,Sql,Postgresql,如果我想给一个日期增加5天,我可以使用INTERVAL功能: select create_ts + interval '5 days' from abc_company; 但是,我的表有一个名为num\u of\u days的字段,我想将其添加到我的create\t中。如下所示: select create_ts + interval num_of_days || ' days' from abc_company; 这是行不通的。如何在postgresql中实现这一点?只需将值乘以一个间隔:

如果我想给一个日期增加5天,我可以使用
INTERVAL
功能:

select create_ts + interval '5 days' from abc_company;
但是,我的表有一个名为
num\u of\u days
的字段,我想将其添加到我的create\t中。如下所示:

select create_ts + interval num_of_days || ' days' from abc_company;

这是行不通的。如何在postgresql中实现这一点?

只需将值乘以一个间隔:

select create_ts + num_of_day * interval '1' day 
from abc_company;
从Postgres 9.4开始,使用
make_interval()
更容易做到这一点:


你只需要一个工作型演员。这种是标准的SQL

select current_timestamp + cast((num_of_days || ' days') as interval)
from abc_company;
这是PostgreSQL特有的另一种语法

select current_timestamp + (num_of_days || ' days')::interval
from abc_company;
我不希望试图记住PostgreSQL支持的第三种类型转换,即类似函数的语法

select current_timestamp + "interval" (num_of_days || ' days')
from abc_company;
为什么??因为,;间歇就是其中之一

此外,名称interval、time和timestamp只能在本示例中使用 如果它们被双引号引用,因为语法冲突,则为时尚。 因此,使用类似cast语法的函数会导致 不一致,可能应该避免


下面是我使用的一个函数:

CREATE OR REPLACE FUNCTION DateAdd(diffType varchar(15), incrementValue int, inputDate timestamp) RETURNS timestamp AS $$
DECLARE
   YEAR_CONST Char(15) := 'year';
   MONTH_CONST Char(15) := 'month';
   WEEK_CONST Char(15) := 'week';
   DAY_CONST Char(15) := 'day';
   HOUR_CONST Char(15) := 'hour';

   dateTemp timestamp;
   intervals interval;
BEGIN
    IF lower($1) = lower(YEAR_CONST) THEN
        select cast(cast(incrementvalue as character varying) || ' year' as interval) into intervals;
    ELSEIF lower($1) = lower(MONTH_CONST) THEN
        select cast(cast(incrementvalue as character varying) || ' months' as interval) into intervals;
    ELSEIF lower($1) = lower(DAY_CONST) THEN
        select cast(cast(incrementvalue as character varying) || ' day' as interval) into intervals;
    ELSEIF lower($1) = lower(WEEK_CONST) THEN
        select cast(cast(incrementvalue as character varying) || ' week' as interval) into intervals;
    ELSEIF lower($1) = lower(HOUR_CONST) THEN
        select cast(cast(incrementvalue as character varying) || ' hour' as interval) into intervals;
    END IF;

   dateTemp := inputdate + intervals;

   RETURN dateTemp;
END;
$$ LANGUAGE plpgsql;
这样使用:

select dateadd('day', 3, current_timestamp);

它支持添加年、月、周、日、小时。可以添加更多支持。我以为你必须使用
间隔“1天”
。我想知道为什么表达式中需要字符串。@GordonLinoff
interval'1'day
是SQL标准中指定interval文本的方式
interval'1 day'
是Postgres的一个扩展,如果我没有错的话,我会在将近4年后感谢你的几天来,我一直在寻找一个类似SQL Server的dateadd函数,但在寻找其他函数时偶然发现了这个函数。
select dateadd('day', 3, current_timestamp);