我需要在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位数字输入年份。
答案 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类型,而不是date
或timestamp
。这很容易重现:
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';