时间戳列上的条件,用于选择一年的数据

时间:2013-01-11 16:16:44

标签: sql postgresql datetime select timestamp

这是一个简单的SELECT,但条件只是约会的年份。例:

SELECT * FROM project WHERE project_reg = '2013';

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

  

错误:la sintaxis de entrada noesválidaparatipo timestamp:«2013»

2 个答案:

答案 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必须在之前评估表中的每一行的表达式才能应用条件。更重要的是,基本索引无法使用,这导致整表扫描,其中索引扫描会便宜得多。
这可以在大表非常昂贵上进行查询。我在这里谈论数量级。

为避免这种情况,你可以:

  • 创建index on an expression

    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来测试您的查询,以衡量差异。