1

这很简单SELECT,但条件只是日期的年份。前任。:

SELECT * FROM project WHERE project_reg = '2013';

project_reg是类型timestamp。返回的错误是“语法无效”。

错误:la sintaxis de entrada no es valida para Tipo 时间戳:«2013»

4

2 回答 2

4
SELECT * 
from project 
where extract(year from project_reg) = 2013
于 2013-01-11T16:32:28.417 回答
3

如果表很小或性能不重要,@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以衡量差异。

于 2013-01-11T19:52:39.483 回答