出于某种原因,我对如何存档感到很遗憾:
SELECT * FROM table WHERE timestamp IS WITHIN THIS MONTH;
我查看了https://www.postgresql.org/docs/9.4/static/functions-datetime.html,但只能向后选择X天。
我正在运行PostgreSQL 9.4
答案 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。