/*Google AdSense自動広告*/

2019年7月8日月曜日

Cloudera Impara SQLでよく使う日時関数のまとめ

以前書いたAlteryxの記事で、「クエリ内で日時を指定するのは面倒だからAlteryxのFormulaを使う」(リンク)と書きましたが、データベースの種類によってはクエリ内の方が便利です。

今回使用したCloudera Impara(主にビッグデータに使われるデータベース)では、Alteryxよりも柔軟な日時関数が用意されており、「1週間前の日」等が直感的に記述できます。Alteryxは処理が複雑になるとタコ足の抽象画みたいになってしまいますからね、クエリ・R言語・マクロで処理をまとめるとスッキリします(結局コード書くんじゃん!!)。

※Cloudera Imparaで日時を処理するデータタイプは、TIMESTAMPと呼ばれます。
 1400-01-01~9999-12-31の間で使用可能で、
 「2015-04-07 15:43:02.892403000」のように秒以下は
 小数点で表されます(Excelは1900年~だし、データのない過去は
 無視ということだろうか?)。



現在の日時を取得する now()

→2020-01-02 03:04:05.6789

TIMESTAMPから日付を抽出する to_date(now()) 

→2020-01-02

TIMESTAMPから日付文字列を返す from_timestamp(now(), 'yyyy/MM/dd')

→'2019/03/02'
後述するto_timestampとの違いは、"return String"文字列を返すこと

文字列からTIMESTAMPを作る to_timestamp('2020/01/02', 'yyyy/MM/dd')

→2020-01-02 00:00:00
前述したfrom_timestampとの違いは、TIMESTAMPを返すこと

年・月などの処理 year, month, week, day, hour, minute, second

それぞれ、hour(now())のような形で、年・月・時間などを整数形式で返します。

また、それぞれ後ろに下記文字を付けることで、加減算したTIMESTAMPを取得できます。
*s_add(now(), 10)
*s_sub(now(), 10)

days_add(now(), -1)とdays_sub(now(), 1)は同じです。クエリの可視性だけです。SUB(subtraction)が引き算だとパッと見で思いつかない人は、前者の方が分かりやすいかもしれません。

日の便利な加減算 date_add(now(), interval 1 weeks) date_sub(now(), interval 3 months)

前述した加減算の他に、日付のみ便利な関数があります。date_addの第2引数にintervl ~ と書くことで、1週間後や1ヵ月後のTIMESTAMPを得ることができます。

日以外では、

now() + interval 3 hours

のように記述すれば、3時間後のTIMESTAMPを得ることができ、そこから日付を抽出したりできます。この記述は直感的で分かりやすいです。ただし、hours_add等の関数と同じ意味になるので、どちらを使うかは統一しないと読み辛くなります。

日の差 datediff(End_TIMESTAMP , Start_TIMESTAMP)

TIMESTAMP同士の日数の差です。

日と曜日 day(now()), dayname, dayofweek

TIMESTAMPの日と曜日を得ることができます。
daynameは「Tuesday」等、dayofweekはSunday=1 ~ Saturday=7が返ってきます。

実際にWhere句で使ってみる


  • 1週間前から1日前までのデータを抽出したい

Where bigdata_timestamp Between date_sub(now(), interval 1 weeks) And date_sub(now(), 1)


  • 同様のパターンだが、項目date_idが文字列形式で、yyyy-MM-dd形式で記述する必要がある場合

Where date_id Between from_timestamp(date_sub(now(), interval 1 weeks), 'yyyy-MM-dd') And from_timestamp(date_sub(now(), 1), 'yyyy-MM-dd')


0 件のコメント:

コメントを投稿