PostgreSQL:SELECT *来自表WHERE时间戳是在这个月内

时间:2017-06-12 14:34:04

标签: sql postgresql postgresql-9.4

出于某种原因,我对如何存档感到很遗憾:

SELECT * FROM table WHERE timestamp IS WITHIN THIS MONTH;

我查看了https://www.postgresql.org/docs/9.4/static/functions-datetime.html,但只能向后选择X天。

我正在运行PostgreSQL 9.4

3 个答案:

答案 0 :(得分:5)

... WHERE date_trunc('month', timestamp)
        = date_trunc('month', current_timestamp);

可替换地:

... WHERE timestamp >= date_trunc('month', current_timestamp)
      AND timestamp <  date_trunc('month', current_timestamp) + INTERVAL '1 month';

第二个版本可以使用timestamp上的索引,第一个版本需要表达date_trunc('month', timestamp)上的索引。

答案 1 :(得分:0)

建议的Laurenz Albe会起作用,但是你会因为你在该字段上丢失基数而导致性能下降,你要么必须索引要查询的表达式(显然PostgreSQL允许这样做:https://www.postgresql.org/docs/current/static/indexes-expressional.html)或创建一个单独的列来存储yyyy-mm值并查询它。

答案 2 :(得分:0)

为什么不用两者来过滤月份?
将本月初作为variable1,将本月末作为variable2 ...

SELECT * FROM table WHERE 
timestamp >= __month_start AND timestamp < __next_month_start

e.g。

SELECT * FROM table 
WHERE 
(
    timestamp >= '20170701'::timestamp 
    AND 
    timestamp < '20170801'::timestamp
)

与在where子句中使用函数不同,这可以保持sargability。