如何在PostgreSQL中定制三个月的date_trunc?

时间:2017-09-26 10:15:49

标签: postgresql timestamp intervals

我正在开展一个项目,其中财政年度是按照三个月来衡量的,并且由于听起来很奇怪,因此每个月的第10天都会测量,而不是由于国家规定的第1天。因此,第一个三个月被认为是在1月10日开始,并在该月9日结束三个月后结束。有没有办法date_trunc或简单地使用PostgreSQL中的这些自定义三个月对时间戳列进行分组?

到目前为止,我只能按月/日/周查询数据:

FROM myTable SELECT( SUM(price) as total, date_trunc('month', 'timpestamp') ) GROUP BY (total)

2 个答案:

答案 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)