Bigquery

Bigqueryのtimestamp型など時刻・日付データのクエリを徹底解説

ぐぅ

ぐぅ

京大工学部▶︎京大大学院情報学研究科▶︎日系企業のITエンジニア。研究室ではAI×通信の研究も行いAIにも知見あり。友人とプログラミング初学者向けブログ「はやぶさエンジニア」を運営。ノーコードで企業し、サブスク型サービスを運営。26歳大阪在住

★本記事は10分で読み終わることができます。

現役エンジニアである筆者Bigqueryで利用できる時刻・日付データのクエリを解説しています。

データを分析するときに、時刻データは必須ですね。

Bigqueryで注意して欲しいのは、JSTとUTCの取り扱いです。

前提として、JSTは日本標準時で、UTCは世界標準時です。JSTの方がUTCに比べて9時間の早いので注意しましょう。

そして、JSTのデータでもBigqueryではUTCと表記されてしまうことがあります。

カラム名に「time_jst」と工夫することをオススメします。

Bigqueryについての詳しい説明は以下の記事を参考にしてください。

BigQuery で学ぶ非エンジニアのための SQL データ分析入門

UdemyでBigqueryのためのSQLを学ぶ講座があります。

操作方法から文法まで体系的に学ぶことができるので、1500円でセール中に購入して受講してみてくださいね。

受講はこちら

現在時刻・日付を取得するクエリ

まずは基礎である、現在時刻の取得ですね。

CURRENT_TIMESTAMP()、CURRENT_DATE()、CURRENT_TIME()

取得するデータ型にはTIMESTAMP、DATE、TIMEがあります。

SELECT CURRENT_TIMESTAMP();

#結果 2021-03-05 13:52:26 UTC

SELECT CURRENT_DATE();

#結果 2021-03-05

SELECT CURRENT_TIME();

#結果 13:52:26

日付・時刻の計算

時刻データの加算・減算・切り捨てなどを解説していきます。

加算:TIMESTAMP_ADD()、DATE_ADD()、TIME_ADD()

時刻の加算を具体例と共に見ていきましょう。

時刻の単位(SECOND, MINUTE, HOUR, DAY, MONTH, YEAR)を指定してあげると色々な足し算ができます。

もちろん、DATE型は年月日、TIME型は時分秒の加算しかできません。

#TIMESTAMPの計算
TIMESTAMP_ADD(時刻, INTERVAL ? SECOND)
TIMESTAMP_ADD(時刻, INTERVAL ? MINUTE)
TIMESTAMP_ADD(時刻, INTERVAL ? HOUR)
TIMESTAMP_ADD(時刻, INTERVAL ? DAY)
TIMESTAMP_ADD(時刻, INTERVAL ? MONTH)
TIMESTAMP_ADD(時刻, INTERVAL ? YEAR)

#DATEの計算
DATE_ADD(時刻, INTERVAL ? DAY)
DATE_ADD(時刻, INTERVAL ? MONTH)
DATE_ADD(時刻, INTERVAL ? YEAR)

#TIMEの計算
TIME_ADD(時刻, INTERVAL ? SECOND)
TIME_ADD(時刻, INTERVAL ? MINUTE)
TIME_ADD(時刻, INTERVAL ? HOUR)

ある時刻から5時間後を取得するといった処理は以下のように書きます。

その時はINTERVALと書いた後に5 HOURと書いてあげるだけです。

TIMESTAMP_ADD("2021-03-05 10:00:00", INTERVAL 5 HOUR)

#結果 "2021-03-05 15:00:00"

現在時刻から20分足したい時は下のようにします。

TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 20 MINUTE)

減算:TIMESTAMP_SUB()、DATE_SUB()、TIME_SUB()

さて、時刻の減算についてです。

〇〇_SUBを使うと減算が可能です。

#TIMESTAMPの計算
TIMESTAMP_SUB(時刻, INTERVAL ? SECOND)
TIMESTAMP_SUB(時刻, INTERVAL ? MINUTE)
TIMESTAMP_SUB(時刻, INTERVAL ? HOUR)
TIMESTAMP_SUB(時刻, INTERVAL ? DAY)
TIMESTAMP_SUB(時刻, INTERVAL ? MONTH)
TIMESTAMP_SUB(時刻, INTERVAL ? YEAR)

#DATEの計算
DATE_SUB(時刻, INTERVAL ? DAY)
DATE_SUB(時刻, INTERVAL ? MONTH)
DATE_SUB(時刻, INTERVAL ? YEAR)

#TIMEの計算
TIME_SUB(時刻, INTERVAL ? SECOND)
TIME_SUB(時刻, INTERVAL ? MINUTE)
TIME_SUB(時刻, INTERVAL ? HOUR)

ある時刻から3日前を取得するといった操作ができます

TIMESTAMP_SUB("2021-03-05 19:00:00", INTERVAL 3 DAY)

#結果 "2021-03-02 19:00:00"

現在時刻から20秒前は下のようにします

TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 20 SECOND)

切り捨て:TIMESTAMP_TRUNC()、DATE_TRUNC()、TIME_TRUNC()

時刻の切り捨てには 〇〇_TRUNCを使います。

例えば、12:25:30を12:00:00に綺麗な時刻に整形したいというような、秒を切り捨てたい、分以下を切り捨てたいという場面で活躍します!

切り捨てられた部分は基本的に00もしくは01が入ります。

#TIMESTAMPの計算
TIMESTAMP_TRUNC(時刻, SECOND)
TIMESTAMP_TRUNC(時刻, MINUTE)
TIMESTAMP_TRUNC(時刻, HOUR)
TIMESTAMP_TRUNC(時刻, DAY) #切り捨てで01が入る
TIMESTAMP_TRUNC(時刻, MONTH) #切り捨てで01が入る
TIMESTAMP_TRUNC(時刻, YEAR) #切り捨てで01が入る

#DATEの計算
DATE_TRUNC(時刻, DAY) #切り捨てで01が入る
DATE_TRUNC(時刻, MONTH) #切り捨てで01が入る
DATE_TRUNC(時刻, YEAR) #切り捨てで01が入る

#TIMEの計算
TIME_TRUNC(時刻, SECOND)
TIME_TRUNC(時刻, MINUTE)
TIME_TRUNC(時刻, HOUR)

下の例は分以下を切り捨てる場合のコードです。

TIMESTAMP_TRUNC("2021-03-05 10:32:14", YEAR)
> "2021-03-05 00:00:00"

現在時刻の秒だけ切り捨てたい時は下のようにします

TIMESTAMP_TRUNC(CURRENT_TIMESTAMP, MINUTE)

差分:TIMESTAMP_DIFF()、DATE_DIFF()、TIME_DIFF()

〇〇_DIFFで二つの時刻の差分が整数で取得できます。

どの単位で差分を取りたいかを指定してあげましょう。

#TIMESTAMPの計算
TIMESTAMP_DIFF(時刻1, 時刻2, SECOND)
TIMESTAMP_DIFF(時刻1, 時刻2, MINUTE)
TIMESTAMP_DIFF(時刻1, 時刻2, HOUR)
TIMESTAMP_DIFF(時刻1, 時刻2, DAY) 
TIMESTAMP_DIFF(時刻1, 時刻2, MONTH)
TIMESTAMP_DIFF(時刻1, 時刻2, YEAR)

#DATEの計算
DATE_DIFF(時刻1, 時刻2, DAY)
DATE_DIFF(時刻1, 時刻2, MONTH)
DATE_DIFF(時刻1, 時刻2, YEAR) 

#TIMEの計算
TIME_DIFF(時刻1, 時刻2, SECOND)
TIME_DIFF(時刻1, 時刻2, MINUTE)
TIME_DIFF(時刻1, 時刻2, HOUR)

TIMESTAMPでの例です。

もちろんマイナスの計算結果も取得できます。

SELECT TIMESTAMP_DIFF("2021-03-05 19:21:56", "2021-03-02 10:32:14", DAY);
#結果 3 (DAY)

SELECT TIMESTAMP_DIFF("2021-03-02 10:32:14", "2021-03-05 19:21:56", DAY);
#結果 -3 (DAY)

SELECT TIMESTAMP_DIFF("2021-03-05 19:21:56", "2021-03-02 10:32:14", HOUR);
#結果 80 (HOUR)
created by Rinker
¥4,180 (2021/08/03 03:28:28時点 Amazon調べ-詳細)

様々な値を抽出する

EXTRACT(取り出したい部分 FROM 時刻);

年、月、日、時、分、秒

具体例で見ていった方が早いので以下を見てください。

#TIMESTMAPの場合
EXTRACT(SECOND FROM 時刻);
EXTRACT(MINUTE FROM 時刻);
EXTRACT(HOUR FROM 時刻);
EXTRACT(DAY FROM 時刻);
EXTRACT(MONTH FROM 時刻);
EXTRACT(YEAR FROM 時刻);

#TIMEの場合
EXTRACT(DAY FROM 時刻);
EXTRACT(MONTH FROM 時刻);
EXTRACT(YEAR FROM 時刻);

#TIMEの場合
EXTRACT(SECOND FROM 時刻);
EXTRACT(MINUTE FROM 時刻);
EXTRACT(HOUR FROM 時刻);
#TIMESTMAPの場合
EXTRACT(SECOND FROM TIMESTAMP("2021-03-05 19:21:56"));
# 56

EXTRACT(MINUTE FROM TIMESTAMP("2021-03-05 19:21:56"));
# 21

EXTRACT(HOUR FROM TIMESTAMP("2021-03-05 19:21:56"));
# 19

EXTRACT(DAY FROM TIMESTAMP("2021-03-05 19:21:56"));
# 5

EXTRACT(MONTH FROM TIMESTAMP("2021-03-05 19:21:56"));
# 3

EXTRACT(YEAR FROM TIMESTAMP("2021-03-05 19:21:56"));
# 2021

曜日(DAYOFWEEK)

TIMESTAMPやDATEを与えると、それが「週の中での何日目か」が取得できます。
結果は 1(日曜日)から7(土曜日)の整数となります。

#TIMESTMAPの場合
EXTRACT(DAYOFWEEK FROM TIMESTAMP("2021-03-05 19:21:56"));

# 6 

何日目(DAYOFYEAR)

TIMESTAMPやDATEを与えると、それが「年の何日目か」を 1 から 366 の整数で返します。
たとえば「1」は「1月1日」を表します。

366は「うるう年」に対応しているからですね。

#TIMESTMAPの場合
EXTRACT(DAYOFYEAR FROM TIMESTAMP("2021-03-05 19:21:56"));

# 64

まとめ

今回は、Bigqueryにおける時刻・日付を扱うクエリを紹介しました。

データ分析において、時刻データは必ず処理することになるので、しっかりと理解しておきましょう!

  • この記事を書いた人
ぐぅ

ぐぅ

京大工学部▶︎京大大学院情報学研究科▶︎日系企業のITエンジニア。研究室ではAI×通信の研究も行いAIにも知見あり。友人とプログラミング初学者向けブログ「はやぶさエンジニア」を運営。ノーコードで企業し、サブスク型サービスを運営。26歳大阪在住

-Bigquery

© 2021 はやぶさエンジニア Powered by AFFINGER5