我正在开展一个项目,其中财政年度是按照三个月来衡量的,并且由于听起来很奇怪,因此每个月的第10天都会测量,而不是由于国家规定的第1天。因此,第一个三个月被认为是在1月10日开始,并在该月9日结束三个月后结束。有没有办法date_trunc
或简单地使用PostgreSQL中的这些自定义三个月对时间戳列进行分组?
到目前为止,我只能按月/日/周查询数据:
FROM myTable SELECT(
SUM(price) as total,
date_trunc('month', 'timpestamp')
)
GROUP BY (total)
答案 0 :(得分:1)
你可以加入结果agants准备的间隔,例如:
t=# select starts,starts+'3 month'::interval ends,mod(ord,4) from generate_series('2015-10-01'::date,'2018-10-01'::date,'3 month'::interval) with ordinality t(starts,ord);
starts | ends | mod
------------------------+------------------------+-----
2015-10-01 00:00:00+00 | 2016-01-01 00:00:00+00 | 1
2016-01-01 00:00:00+00 | 2016-04-01 00:00:00+00 | 2
2016-04-01 00:00:00+00 | 2016-07-01 00:00:00+00 | 3
2016-07-01 00:00:00+00 | 2016-10-01 00:00:00+00 | 0
2016-10-01 00:00:00+00 | 2017-01-01 00:00:00+00 | 1
2017-01-01 00:00:00+00 | 2017-04-01 00:00:00+00 | 2
2017-04-01 00:00:00+00 | 2017-07-01 00:00:00+00 | 3
2017-07-01 00:00:00+00 | 2017-10-01 00:00:00+00 | 0
2017-10-01 00:00:00+00 | 2018-01-01 00:00:00+00 | 1
2018-01-01 00:00:00+00 | 2018-04-01 00:00:00+00 | 2
2018-04-01 00:00:00+00 | 2018-07-01 00:00:00+00 | 3
2018-07-01 00:00:00+00 | 2018-10-01 00:00:00+00 | 0
2018-10-01 00:00:00+00 | 2019-01-01 00:00:00+00 | 1
(13 rows)
在这里你可以使用rownum顺序的剩余部分除以semestres的数量来获得学期编号(当然你需要处理0 - 要么称之为4,要么从减去一个学期开始,只需使用{{1 },或使用mod(ord,4)+1
等等)
答案 1 :(得分:1)
使用函数(或其中的表达式):
create or replace function get_trimester(timestamp)
returns integer language sql immutable as $$
select (extract('month' from $1::date- 9)::int- 1)/ 3 + 1
$$;
检查某些日期的功能:
with my_table(t) as (
values
('2017-01-09'::timestamp),
('2017-01-10'),
('2017-04-09'),
('2017-04-10'),
('2017-07-09'),
('2017-07-10'),
('2017-10-09'),
('2017-10-10'),
('2017-12-31')
)
select t, get_trimester(t)
from my_table
t | get_trimester
---------------------+---------------
2017-01-09 00:00:00 | 4
2017-01-10 00:00:00 | 1
2017-04-09 00:00:00 | 1
2017-04-10 00:00:00 | 2
2017-07-09 00:00:00 | 2
2017-07-10 00:00:00 | 3
2017-10-09 00:00:00 | 3
2017-10-10 00:00:00 | 4
2017-12-31 00:00:00 | 4
(9 rows)