这是一个简单的SELECT
,但条件只是约会的年份。例:
SELECT * FROM project WHERE project_reg = '2013';
project_reg
是timestamp
类型。返回的错误是“语法无效”。
错误:la sintaxis de entrada noesválidaparatipo timestamp:«2013»
答案 0 :(得分:4)
SELECT *
from project
where extract(year from project_reg) = 2013
答案 1 :(得分:3)
如果表格很小或性能不重要,@Clodoaldo's answer工作正常 否则,我会建议这种更复杂的形式:
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
来测试您的查询,以衡量差异。