Treasure Data(Presto/Hive)에서 월의 마지막 날을 얻는 방법
8307 단어 TreasureDatahivePresto
처음에
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에 군배가 오르네요!
Reference
이 문제에 관하여(Treasure Data(Presto/Hive)에서 월의 마지막 날을 얻는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kajuki1113/items/04bd18358fa9f601eb3c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)