PostgreSQL如何连接间隔值'2天'

发布于 2025-01-07 18:44:49 字数 606 浏览 2 评论 0原文

在 PostgreSQL 中,我想将 current_timestampinterval 连接起来,如下所示:

select current_timestamp + interval 2||' days'

但是当我这样做时,我收到错误:

[Err] ERROR:  syntax error at or near "2"
LINE 1: select current_timestamp + interval 2||' days'

但是如果我这样做,它会正常工作:

select current_timestamp + interval '2 days'

为什么其中一个有效,而另一个却不起作用?

参考下页 http://www.postgresql.org/docs/8.0/static/functions-datetime.html< /a>

In PostgreSQL I want to concat the current_timestamp with an interval as follows:

select current_timestamp + interval 2||' days'

But when I do, I get an error:

[Err] ERROR:  syntax error at or near "2"
LINE 1: select current_timestamp + interval 2||' days'

But if I do it like this, it works correctly:

select current_timestamp + interval '2 days'

Why does one work, but not the other?

With reference to the following page
http://www.postgresql.org/docs/8.0/static/functions-datetime.html

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

怪我闹别瞎闹 2025-01-14 18:44:49

部分问题在于间隔的标准 SQL 表达式引用了数字,但没有引用关键字。所以你必须小心。

select current_date, current_date + interval '2' day;
--
2012-02-21   2012-02-23 00:00:00

在 PostgreSQL 中,像“2 day”和“2 days”这样的引用也有效。所以你可能会认为'2'|| “天”是等价的,但事实并非如此。

select current_date, current_date + interval '2' || ' days';
--
2012-02-21   2012-02-21 00:00:02 days

正如 AH 所说,解决方案是将结果字符串转换为区间。

您还可以使用变量代替 2。这会生成 2012 年的日历。

-- 0 to 365 is 366 days; 2012 is a leap year.
select ('2012-01-01'::date + (n || ' days')::interval)::date calendar_date
from generate_series(0, 365) n;

我使用最终的日期转换,因为日期 + 间隔返回时间戳。

Part of the problem is that the standard SQL expression for intervals quotes the number, but not the keywords. So you have to be careful.

select current_date, current_date + interval '2' day;
--
2012-02-21   2012-02-23 00:00:00

In PostgreSQL, quoting like '2 day' and '2 days' also works. So you might think that '2' || ' days' would be equivalent, but it's not.

select current_date, current_date + interval '2' || ' days';
--
2012-02-21   2012-02-21 00:00:02 days

The solution, as A.H. said, is to cast the result string as an interval.

You can also use a variable in place of 2. This generates a calendar for 2012.

-- 0 to 365 is 366 days; 2012 is a leap year.
select ('2012-01-01'::date + (n || ' days')::interval)::date calendar_date
from generate_series(0, 365) n;

I use that final cast to date, because date + interval returns a timestamp.

完美的未来在梦里 2025-01-14 18:44:49

请尝试以下语法:

select current_timestamp + ( 2 || ' days')::interval;

或者甚至是这个:

select current_timestamp + 2 * interval '1 day';

Please try this syntax:

select current_timestamp + ( 2 || ' days')::interval;

or even this one:

select current_timestamp + 2 * interval '1 day';
怪异←思 2025-01-14 18:44:49

我使用这个

SELECT now() + (Var1 || ' ' || Var2)::interval

无联系函数

I use this

SELECT now() + (Var1 || ' ' || Var2)::interval

no concact function

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文