この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
ALBのアクセスログなどタイムスタンプのタイムゾーンがUTCになっている場合は多くあると思います。頭の中で読み替えるのはそれほど難しくないのですが、量が多かったり、クエリの結果を共有する場合はタイムゾーンの変換をしたい場合があります。調べてみると簡単にタイムゾーンの変更ができたので、そのメモです。
前提
今回はALBのアクセスログをAthenaでクエリする場合を例に考えます。タイムスタンプのフォーマットやタイムゾーンはユースケースによって異なると思いますので、適宜読み替えてください。
タイムスタンプのパース
ALBのログをAthenaでクエリする場合そのままではタイムスタンプ(timeカラム)は文字列型です。タイムゾーンの変換前にこれをTIMESTAMP型へパースする必要があります。
パースするには以下の通りparse_datetime関数を使います。
parse_datetime(time,'yyyy-MM-dd''T''HH:mm:ss.SSSSSS''Z')
タイムゾーンの変更
タイムゾーンの変換にはAT TIME ZONEオペレータを使います。ALBログの場合は以下のようになります。
parse_datetime(time,'yyyy-MM-dd''T''HH:mm:ss.SSSSSS''Z') AT TIME ZONE 'Asia/Tokyo'
リテラルで指定する場合は以下のようになります。
SELECT '2020-12-01 13:00 Asia/Tokyo';
-- 検索条件として使う例;
WHERE parse_datetime(time,'yyyy-MM-dd''T''HH:mm:ss.SSSSSS''Z')
BETWEEN timestamp '2020-12-01 12:00 Asia/Tokyo'
AND timestamp '2020-12-01 13:00 Asia/Tokyo'
まとめ
AthenaではAT TIME ZONE オペレーターでTIMESTAMP型値のタイムゾーンを変更できます。