这很简单SELECT
,但条件只是日期的年份。前任。:
SELECT * FROM project WHERE project_reg = '2013';
project_reg
是类型timestamp
。返回的错误是“语法无效”。
错误:la sintaxis de entrada no es valida para Tipo 时间戳:«2013»
这很简单SELECT
,但条件只是日期的年份。前任。:
SELECT * FROM project WHERE project_reg = '2013';
project_reg
是类型timestamp
。返回的错误是“语法无效”。
错误:la sintaxis de entrada no es valida para Tipo 时间戳:«2013»
SELECT *
from project
where extract(year from project_reg) = 2013
如果表很小或性能不重要,@Clodoaldo 的答案就可以了。
否则,我会建议这种更复杂的形式:
SELECT *
FROM project
WHERE project_reg >= '2013-01-01 0:0'
AND project_reg < '2014-01-01 0:0'
当您的条件检查表达式(如extract(year from project_reg)
)时,查询优化器只能重写最基本的形式,以按原样应用于表列。这个不行
否则,Postgres 必须先计算表中每一行的表达式,然后才能应用条件。更重要的是,不能使用基本索引,这会导致全表扫描,而索引扫描会便宜得多。
这会使大表上的查询变得非常昂贵。我在这里说的是数量级。
为避免这种情况,您可以:
在表达式上创建索引
CREATE INDEX project_project_reg_year_idx
ON project (extract(year FROM project_reg)::int);
你可能还没有那个。
请注意我如何将结果转换为integer
,它比 . 返回的双精度更适合“年” extract()
。您将在查询中使用相同的表达式。
缺点:这样的索引相当专业,只能用于匹配表达式。在大多数情况下,一个用于多种目的的基本索引是可取的。
重写您的条件,以便可以直接检查表列。如果你可以的话。
幸运的是,你可以。这就是我建议的查询所做的。这样,可以使用普通索引:
CREATE INDEX project_project_reg_idx ON project (project_reg);
你可能已经有了。至少你可能应该。
使用索引和不使用索引测试您的查询EXPLAIN ANALYZE
以衡量差异。