Treasure Data(Presto/Hive)에서 월의 마지막 날을 얻는 방법

처음에



SQL에서 월의 마지막 날인지 여부 WHERE 절로 판별하고 싶은, 뭐가 있겠지요?
Treasure Data(Presto/Hive)에서 어떻게 달의 마지막 날을 얻는 방법을 소개합니다.

Hive의 경우



Hive의 경우 아무 것도 생각할 필요가 없습니다. last_day 라는 함수가 있기 때문입니다.
취급이 불안하다고 생각하는 사람도 많을 것이다, 윤년의 검증도 포함해 아래와 같은 쿼리로 각 해의 2월의 마지막 날을 취득해 보겠습니다.
select last_day('2016-02-10')
union all
select last_day('2017-02-10')
union all
select last_day('2018-02-10')
union all
select last_day('2019-02-10')
union all
select last_day('2020-02-10')
;

결과는 다음과 같습니다. 무사히 마지막 날을 얻을 수 있었습니다.


Presto의 경우



Presto 326이라면 last_day_of_month라는 멋진 함수가 있지만 Treasure Data가 호스팅하는 Presto 버전 (0.205 및 317)에는이 함수가 없습니다.
따라서 다음과 같이 최선을 다해야합니다.
select date_format(date_parse(date_format(timestamp '2016-02-10' + INTERVAL '1' month, '%Y-%m-01'), '%Y-%m-%d') - INTERVAL '1' day, '%Y-%m-%d')
union all
select date_format(date_parse(date_format(timestamp '2017-02-10' + INTERVAL '1' month, '%Y-%m-01'), '%Y-%m-%d') - INTERVAL '1' day, '%Y-%m-%d')
union all
select date_format(date_parse(date_format(timestamp '2018-02-10' + INTERVAL '1' month, '%Y-%m-01'), '%Y-%m-%d') - INTERVAL '1' day, '%Y-%m-%d')
union all
select date_format(date_parse(date_format(timestamp '2019-02-10' + INTERVAL '1' month, '%Y-%m-01'), '%Y-%m-%d') - INTERVAL '1' day, '%Y-%m-%d')
union all
select date_format(date_parse(date_format(timestamp '2020-02-10' + INTERVAL '1' month, '%Y-%m-01'), '%Y-%m-%d') - INTERVAL '1' day, '%Y-%m-%d')
;

하는 일은 아래와 같이 다음 달의 첫날을 계산하여 하루를 뺀 것입니다.
timestamp '2016-02-10' <--元データ
↓
timestamp '2016-02-10' + INTERVAL '1' month <--1ヶ月足す
↓
date_format(timestamp '2020-02-10' + INTERVAL '1' month, '%Y-%m-01') <--月の初日(01日)にする
↓
date_format(date_parse(date_format(timestamp '2020-02-10' + INTERVAL '1' month, '%Y-%m-01'), '%Y-%m-%d') - INTERVAL '1' day, '%Y-%m-%d') <--フォーマットを整えて1日引く

아래의 쿼리로 각 단계를 표시하면 알기 쉬울지도 모릅니다.
select timestamp '2020-02-10',
       timestamp '2020-02-10' + INTERVAL '1' month,
       date_format(timestamp '2020-02-10' + INTERVAL '1' month, '%Y-%m-01'),
       date_format(date_parse(date_format(timestamp '2020-02-10' + INTERVAL '1' month, '%Y-%m-01'), '%Y-%m-%d') - INTERVAL '1' day, '%Y-%m-%d')
;

결과는 다음과 같습니다.



마지막으로



어떻습니까?
Presto 쪽이 편리한 함수가 갖추어져 있는 이미지가 있을까 생각합니다만, 달의 마지막 날을 취득하는 부분에 관해서는 Hive에 군배가 오르네요!

좋은 웹페이지 즐겨찾기