带有 age() 函数的 Postgresql WHERE

Postgresql WHERE with age() function

我很确定之前有人问过这个问题,但我正在努力为包含

等数据的 table 获取正确的语法
id  date        type                                    report  item_id
1   2018-11-07  Veröffentlichung des 9-Monats-Berichtes TRUE    16
2   2018-11-06  Veröffentlichung des 9-Monats-Berichtes TRUE    17
3   2019-03-07  Veröffentlichung des Jahresberichtes    TRUE    17
4   2019-05-10  Bericht zum 1. Quartal                  TRUE    17

我试图制定的查询是

SELECT date, AGE(now(), date) as t1
FROM dates
WHERE t1 > 0

意思是我只是在寻找过去的值。
但是,我得到一个错误

ERROR: column "t1" does not exist

(当然是别名)。 Postgresql 在这里不支持别名吗?

您不能在WHERE条件中引用别名,因为逻辑上WHERESELECT之前执行。

您可以使用子查询:

SELECT * 
FROM (SELECT date, AGE(now(), date) as t1
      FROM dates) sub
WHERE sub.t1 > interval '0::seconds';

LATERAL(我最喜欢的方式):

SELECT date, s.t1
FROM dates
,LATERAL (SELECT AGE(now(), date) as t1) AS s
WHERE s.t1 > interval '0::seconds';

或重复表达(违反DRY principle):

SELECT date, AGE(now(), date) as t1
FROM dates
WHERE AGE(now(), date) > interval '0::seconds';

至于计算AGE你真的不需要它,因为你可以将它重写为date > now()


相关文章:

PostgreSQL: using a calculated column in the same query

如果您赶时间并且有日期的(有序的)索引,请不要这样做。

因为此查询可以使用索引,只需少量编码工作即可获得巨大的性能提升。

SELECT date, AGE(now(), date) AS t1
FROM dates
WHERE date > now();

我说 now(),因为你做到了,但也许你想要 CURRENT_DATE 而不是

要创建合适的索引,请执行

create index dates_date on dates(date);