[小ネタ]AthenaでALBアクセスログ のtimestampのタイムゾーンの変換をする

AthenaではAT TIME ZONE オペレーターでTIMESTAMP型値のタイムゾーンを変更できます。
2020.11.27

はじめに

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型値のタイムゾーンを変更できます。