代码之家  ›  专栏  ›  技术社区  ›  Jan

Postgresql WHERE with age()函数[重复]

  •  2
  • Jan  · 技术社区  · 6 年前

    我很肯定以前有人问过这个问题,但我正在努力为包含以下数据的表获取正确的语法

    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
    

    意思是我只寻找过去的价值观。

    错误:列“t1”不存在

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

    2 回复  |  直到 6 年前
        1
  •  3
  •   Lukasz Szozda    6 年前

    不能在中引用别名 WHERE 哪里 SELECT .

    可以使用子查询:

    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

    MySQL - Search into a custom Column

    Why do “linq to sql” queries starts with the FROM keyword unlike regular SQL queries?

        2
  •  2
  •   Jasen    6 年前

    如果你很匆忙,并且在日期上有一个(有序的)索引,不要这样做。

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

    我说 now() ,因为你做了,但也许你想 CURRENT_DATE 相反

    create index dates_date on dates(date);