我有一个查询,我计算每年的行数:
SELECT
count(*) as activation_count
, extract(year from activated_at) as year
FROM "activations"
WHERE ...
GROUP BY year
但是我希望从9月到9月,而不是1月到1月。因此按学年而不是历年分组。
我可以修改我的查询吗?
更一般地说,是否可以按时间范围进行分组并指定偏移量,例如:extract(year from activated_at offset interval 2 month) as year
(这不起作用,只是我想要的想法)
答案 0 :(得分:2)
你真正想要的是将9月之后的所有日期视为"明年",所以以下内容应该有效:
select count(*) as activation_count,
case
when extract(month from activated_at) >= 9 then extract(year from activated_at) + 1
else extract(year from activated_at)
end as school_year
from activations
group by school_year;
答案 1 :(得分:1)
假设某人的activated_at
是2016-09-01'应计为year = 2017
,在activated_at
(翻译(在数学意义上)9月到1月)时,您可以将extract
添加4个月。
SELECT * FROM activations ;
┌────────────────────────┐
│ activated_at │
├────────────────────────┤
│ 2016-08-01 00:00:00+02 │
│ 2016-09-01 00:00:00+02 │
│ 2016-10-01 00:00:00+02 │
│ 2017-02-02 00:00:00+01 │
└────────────────────────┘
(4 rows)
SELECT COUNT(*),
EXTRACT(year FROM (activated_at + '4 months'::interval)) AS year
FROM activations
GROUP BY year;
┌───────┬──────┐
│ count │ year │
├───────┼──────┤
│ 3 │ 2017 │
│ 1 │ 2016 │
└───────┴──────┘
(2 rows)
如果将其计为year = 2016
,则可以删除8个月。