在PostgreSQL中查找过去n个月中每个月的新记录

时间:2011-06-21 18:41:57

标签: postgresql datetime

我有一张记录表,其中包含一个创建日期。我想返回过去6个日历月中的每一个的新记录,包括本月的部分记录。我对SQL Server了如指掌,但对PostgreSQL并不熟悉。

我已经能够使用此查询获取滚动月份的数据:

select 
COUNT(ID) as Total,
COUNT(CASE WHEN createddate between (now() - '1 month'::interval)::timestamp AND now() THEN AG.ID END) as ThisMonth,
COUNT(CASE WHEN createddate between (now() - '2 month'::interval)::timestamp AND (now() - '1 month'::interval)::timestamp THEN AG.ID END) as LastMonth,
COUNT(CASE WHEN createddate between (now() - '3 month'::interval)::timestamp AND (now() - '2 month'::interval)::timestamp THEN AG.ID END) as PrevMonth,
COUNT(CASE WHEN createddate between (now() - '4 month'::interval)::timestamp AND (now() - '3 month'::interval)::timestamp THEN AG.ID END) as PrevMonth2,
COUNT(CASE WHEN createddate between (now() - '5 month'::interval)::timestamp AND (now() - '4 month'::interval)::timestamp THEN AG.ID END) as PrevMonth3,
COUNT(CASE WHEN createddate between (now() - '6 month'::interval)::timestamp AND (now() - '5 month'::interval)::timestamp THEN AG.ID END) as PrevMonth4
FROM a_group AG

但是在6月21日,这将返回5 / 22-6 / 21,4 / 22-5 / 21等数据。 我希望数据如下:6 / 1-6 / 21(部分当前月份),5 / 1-5 / 31等。

有什么建议吗?我也怀疑我可以在一个循环中做到这一点,但我还不熟悉语法。现在,我正在从PostgreSQL Maestro对备份文件进行测试。

感谢。

1 个答案:

答案 0 :(得分:5)

我认为date_trunc功能可能是您的朋友(请参阅postgres docs)。你会做这样的事情我猜:

select 
COUNT(ID) as Total,
COUNT(CASE WHEN createddate between date_trunc('month', now()) AND now() THEN AG.ID END) as ThisMonth,
COUNT(CASE WHEN createddate between date_trunc('month', now()) - interval '1 month' AND date_trunc('month', now()) - interval '1 day' THEN AG.ID END) as LastMonth,

等...