如何在PostgreSQL中选择某一年之后的日期



简而言之,当我执行以下SQL命令时:

SELECT EXTRACT(YEAR FROM pub_date) AS year FROM news_stories

我得到了从2008年到2014年的一大堆年份。

但如果我这样做

SELECT EXTRACT(YEAR FROM pub_date) AS year FROM news_stories WHERE year > 2010

我得到一个空的结果。 我做错了什么?

输出列在 ORDER BYGROUP BY 子句中可见,因为这些列是在计算 SELECT 子句中的表达式应用的。它们在WHEREHAVING子句中不可见。因此,不能引用输出列名称year。您必须根据输入列重复表达式。显然,有一个同名的输入列,否则你会得到一个异常。详:

  • 如何为 SELECT、WHERE 和 ORDER BY 子句重用结果?

为了使查询速度更快,应使用可优化的谓词:

SELECT EXTRACT(YEAR FROM pub_date) AS year
FROM   news_stories
WHERE  pub_date >= '2010-1-1'::date;

这通常更快,因为 Postgres 可以直接将pub_date中的值与给定值进行比较,而无需先从每一行中提取年份。
更重要的是,pub_date上的普通索引可以这样使用 - 如果 Postgres 希望该路由更快(仅索引扫描或足够选择性(。

数据库中

必须有一个名为 year 的列,否则 SQL 将返回错误。 不能在定义别名的 selectwhere 子句中使用别名。

使用子查询或重复表达式:

SELECT EXTRACT(YEAR FROM pub_date) AS year
FROM news_stories
WHERE EXTRACT(YEAR FROM pub_date) > 2010;

或作为子查询:

select *
from (SELECT EXTRACT(YEAR FROM pub_date) AS year
      FROM news_stories
     ) n
where year > 2010;

试试这个。不能在 where 子句中使用 alias nameWHERE clauseSELECT clause(*)之前处理。由于您有名为 Year 的列,因此您没有收到错误。

SELECT EXTRACT(YEAR FROM pub_date) AS year 
FROM news_stories 
WHERE EXTRACT(YEAR FROM pub_date) > 2010

最新更新