在一个时间戳列上设置条件,选择一年的数据[英] Condition on a timestamp column to select data for a year

本文是小编为大家收集整理的关于在一个时间戳列上设置条件,选择一年的数据的处理方法,想解了在一个时间戳列上设置条件,选择一年的数据的问题怎么解决?在一个时间戳列上设置条件,选择一年的数据问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

这是一个简单的SELECT,但条件只是日期的一年.例如:

SELECT * FROM project WHERE project_reg = '2013';

project_reg是类型timestamp.返回的错误是"语法是无效的".

错误:la sintaxis de entrada no esválidapara 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必须在表中的每个行中评估中的每一行的表达式.更重要的是,基本索引无法使用,这会导致全表扫描,其中索引扫描将更便宜.
这可以在大桌子上进行查询非常昂贵的.我在这里说的数量级.

为了避免这种情况:

  • 创建一个 in DIDEX on EXPERSE index

    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);
    

    您可能已经拥有了.至少您可能应该.

没有索引来测量差异.

本文地址:https://www.itbaoku.cn/post/1764180.html