Sql 使用表中的值的Postgres间隔
如果我想给一个日期增加5天,我可以使用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中实现这一点?只需将值乘以一个间隔:
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天”
。我想知道为什么表达式中需要字符串。@GordonLinoffinterval'1'day
是SQL标准中指定interval文本的方式interval'1 day'
是Postgres的一个扩展,如果我没有错的话,我会在将近4年后感谢你的几天来,我一直在寻找一个类似SQL Server的dateadd函数,但在寻找其他函数时偶然发现了这个函数。
select dateadd('day', 3, current_timestamp);