【问题标题】:PostgreSQL: month := interval '30 days';PostgreSQL:月:=间隔'30天';
【发布时间】:2016-01-15 20:03:16
【问题描述】:

尝试从 2 个表中删除超过 1 个月的记录,其中 1 个引用了另一个表中的“id”列:

create or replace function quincytrack_clean()
        returns void as $BODY$
        begin
                month := interval '30 days';

                delete from hide_id
                where id in
                (select id from quincytrack
                where age(QDATETIME) > month);

                delete from quincytrack
                where age(QDATETIME) > month;
        end;
$BODY$ language plpgsql;

但这失败了:

ERROR:  syntax error at or near "month"
LINE 1: month := interval '30 days'
        ^
QUERY:  month := interval '30 days'
CONTEXT:  SQL statement in PL/PgSQL function "quincytrack_clean" near line 2

我正在阅读the doc,但不明白我的声明有什么问题...

【问题讨论】:

  • 1 个月不等于 30 天:12 个月 = 1 年,12 * 30 天 = 360 天,比一整年少 5 或 6 天。需要 1 个月时使用“1 个月”。

标签: postgresql plpgsql


【解决方案1】:

您需要声明变量“月”,即:

declare
    month interval;
begin
    month := interval '30 days';
end;

此外,您可能需要重新检查您的“位置”标准。如果 QDATETIME 是索引列,我认为它不会使用索引,而 QDATETIME < (now() - month) 会。

【讨论】:

  • 谢谢。我认为 DECLARE 仅用于声明过程参数。
【解决方案2】:

您需要先声明变量,然后才能使用它。

... 宣布 月间隔; 开始 月:=间隔'30天'; ...

但我会避免使用保留字或内部函数名的变量名。

【讨论】:

  • 他的区间语法是正确的。 interval '30' days 不是一个有效的表达式...select interval '30' days 生成一个名为 days 的列,其值为 30 秒...
  • interval '30' day 是 ANSI 标准,受 PostgreSQL 支持(我用 PostgreSQL 9.0 测试了我的代码)。但似乎 PostgreSQL 也支持我不知道的 OP 编写的方式。
  • `做$$声明月份间隔;开始月份:=间隔'30'天;提高信息'%',月;结尾; $$; ` - 打印 30 秒的间隔。
  • 有趣。似乎在不同的环境中处理方式不同。将select interval '3' days 与 JDBC 工具一起使用时,我正确地得到了一个间隔输出 (0 years 0 mons 3 days 0 hours 0 mins 0.00 secs),而使用 psql 我确实得到了一个名为 days 的列,间隔为 3 秒。非常非常奇怪
  • 好的,我想我找到了不同行为的原因。据我在阅读规范后所知,ANSI 标准确实是interval '3' day(注意单数日)。如果像这样使用select interval '3' day psql 也会返回正确的间隔。似乎在使用days(复数)时,这不会被识别为间隔单位,因此使用默认单位(即秒)并使用days 作为列别名。所以只需添加一个s。在我最初的帖子中,我粘贴了原始帖子并忘记删除最后的s
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-07
  • 2019-07-11
  • 1970-01-01
  • 2010-09-25
相关资源
最近更新 更多