2017-09-26 8 views
1

저는 회계 연도가 3 년 단위로 측정되는 프로젝트에 종사하고 있으며, 각 임신은 국가 규정으로 인해 1 일 대신 10 일부터 측정됩니다. 그래서 첫 번째 임신은 1 월 10 일에 시작하여 그 달 9 일 후 3 개월 후에 끝나는 것으로 간주됩니다. date_trunc으로 이동하거나 PostgreSQL에서이 사용자 정의 트리 매스터를 사용하여 타임 스탬프 열을 그룹화하는 방법이 있습니까?PostgreSQL에서 맞춤 삼자로 date_trunc하는 방법?

지금까지 난 단지 같은 뭔가 월/일/주로 데이터를 조회 할 수있었습니다 :

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

답변

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) 
+0

나는이 접근법을 사용하여 끝냈다. 날짜 계열을 생성하기가 쉬웠습니다. 감사! – Ivan

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) 

여기서 나머지 수는 semestres의 수로 나누어서 학기 수를 구할 수 있습니다. 물론 0을 다루어야합니다. 4를 부르거나 jus를 1 학기에서 시작하여 mod(ord,4)+1을 사용하거나을 사용한다.등)

+0

이 큰 호응 해 주셔서 감사합니다. 위의 klin의 예제에서와 같이 대신 함수를 작성하여이 문제를 해결했습니다. – Ivan