【Spark SQL】その月の月初の日を指定するクエリ

SparkSQLにはlast_day という指定した日の月の月末の日を返す関数があるのですが、月初の日を返す関数がありません。 そこで、月初の日を返すやり方はないのかと思い、試行錯誤してみました。 (前提条件として、時刻の環境はUTCを想定しているため、都度FROM_UTC_TIMESTAMP によってUTC+9に調整しています。)

方法1

DATE_ADD(TO_DATE(FROM_UTC_TIMESTAMP(CURRENT_DATE, 'Asia/Tokyo')), -(DAYOFMONTH(FROM_UTC_TIMESTAMP(CURRENT_DATE, 'Asia/Tokyo')) - 1))

こちらは、「その月の日から1引いた日」を「その月の日」から引くことによって実現する方法です。 例えば、10/18であれば、18 - (18 - 1) = 1という計算式になります。

ただ、これだと若干長くなってしまいました。他にも方法がないかと関数を見漁っていたところ、他にも方法がありました。

方法2

 TO_DATE(TRUNC(FROM_UTC_TIMESTAMP(CURRENT_DATE, 'Asia/Tokyo'), 'month'))

TRUNC という関数は、指定された単位で切り捨てを行なった日を返り値とする関数です。 例えば、2017-10-18の場合

TO_DATE(TRUNC(FROM_UTC_TIMESTAMP(CURRENT_DATE, 'Asia/Tokyo'), 'month'))2017-10-01 TO_DATE(TRUNC(FROM_UTC_TIMESTAMP(CURRENT_DATE, 'Asia/Tokyo'), 'year'))2017-01-01

となります。 これによって月初の日にちを取得することができます。

Ref