从WHERE子句中的日期中提取年份

时间:2014-12-12 09:42:08

标签: postgresql date types where-clause

我需要在EXTRACT()子句中加入WHERE函数,如下所示:

SELECT * FROM my_table WHERE EXTRACT(YEAR FROM date) = '2014';

我收到这样的消息:

pg_catalog.date_part(unknown, text) doesn't exist** 
SQL State 42883

以下是my_table内容(gid INTEGER, date DATE):

  gid  |    date
-------+-------------
  1    | 2014-12-12
  2    | 2014-12-08
  3    | 2013-17-15

我必须这样做,因为查询是从包含“年”字段的网站上的表单发送的,用户以4位数字输入年份。

2 个答案:

答案 0 :(得分:6)

问题是您的专栏属于数据类型 text,而EXTRACT()仅适用于date / time types

您应该将列转换为适当的数据类型。

ALTER TABLE my_table ALTER COLUMN date TYPE date;

那个更小(4个字节而不是11个文本),更快更清洁(不允许非法日期和大多数错别字)。
如果您使用非标准格式,请在转换表达式中添加USING子句。例如:

此外,为了使您的查询在date快速使用普通索引,您应该使用sargable谓词。像:

SELECT * FROM my_table
WHERE    date >= '2014-01-01'
AND      date <  '2015-01-01';

或者,与今年的4位数输入一起使用:

SELECT * FROM my_table
WHERE    date >= to_date('2014', 'YYYY')
AND      date <  to_date('2015', 'YYYY');

你也可以更明确:

to_date('2014' || '0101', 'YYYYMMNDD')

两者都生成相同的日期'2014-01-01'

除此之外:date是标准SQL中的reserved word和Postgres中的基本类型名称。不要将它用作标识符。

答案 1 :(得分:0)

这是因为该列具有text或varchar类型,而不是datetimestamp。这很容易重现:

SELECT 1 WHERE extract(year from '2014-01-01'::text)='2014';

产生此错误:

  

错误:函数pg_catalog.date_part(未知,文本)不存在
  第1行:SELECT 1 WHERE提取(年份来自'2014-01-01':: text)='2014';
                         ^提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。

对于类似文本的数据类型,

extract或基础函数date_part不存在,但无论如何都不需要它们。从此日期格式中提取年份相当于获取4个第一个字符,因此您的查询将是:

SELECT * FROM my_table WHERE left(date,4)='2014';