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

时间:2014-12-07 03:10:56

标签: sql 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

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

3 个答案:

答案 0 :(得分:3)

输出列在ORDER BYGROUP BY子句中可见,因为在评估SELECT子句中的表达式之后应用。它们在 WHERE HAVING子句中不可见。因此,您无法引用输出列名year。您必须根据输入列重复表达式。显然,有一个同名的输入列,或者你会得到一个例外。详细说明:

要使您的查询,您应该使用 sargable 谓词:

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

您必须在数据库中有一个名为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;