Amazon Redshift: 新しいデータ型『タイムゾーン付きタイムスタンプ(TIMESTAMPTZ)』をつかってみた。

Amazon Redshift

はじめに

好物はインフラとフロントエンドのかじわらゆたかです。
以前しんやの記事でRedsshiftにタイムゾーン付きタイムスタンプ型が使用可能になった *1と言ったエントリがあがりました。こちら弊社の開発環境にも適用されたので実際の挙動について確認してみたいと思います。

Timezone付きデータの取り込み

TimeZoneを含んだTIMESTAMP型はTIMESTAMPTZとなります。 以下のようなサンプルテーブルを作成し、データを取り込ませてみようと思います。

Table作成

CREATE TABLE timestamp_check(
    abbreviation VARCHAR(25),
    string VARCHAR(50),
    timestamp_value TIMESTAMP,
    timestamptz_value TIMESTAMPTZ);

iso8601basic.tsv (ISO8601 基本形式)

JST(BASIC0000)  20161020T000000+0900    20161020T000000+0900    20161020T000000+0900
UTC(BASIC0000)  20161020T000000Z    20161020T000000Z    20161020T000000Z
JST(BASIC0900)  20161020T090000+0900    20161020T090000+0900    20161020T090000+0900
UTC(BASIC0900)  20161020T090000Z    20161020T090000Z    20161020T090000Z

iso8601extended.tsv (ISO8601 拡張形式)

JST(Extended0000)   2016-10-21T00:00:00+09:00   2016-10-21T00:00:00+09:00   2016-10-21T00:00:00+09:00
UTC(Extended0000)   2016-10-21T00:00:00Z    2016-10-21T00:00:00Z    2016-10-21T00:00:00Z
JST(Extended0900)   2016-10-21T09:00:00+09:00   2016-10-21T09:00:00+09:00   2016-10-21T09:00:00+09:00
UTC(Extended0900)   2016-10-21T09:00:00Z    2016-10-21T09:00:00Z    2016-10-21T09:00:00Z

データ投入&確認

COPY timestamp_check 
(abbreviation,string,timestamp_value,timestamptz_value) 
FROM 's3://cm-kajiwara-redshift-load/iso8601basic.tsv'  
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/redshift-role' 
DELIMITER AS '\t' TIMEFORMAT AS 'auto';
COPY timestamp_check 
(abbreviation,string,timestamp_value,timestamptz_value) 
FROM 's3://cm-kajiwara-redshift-load/iso8601extended.tsv'  
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/redshift-role' 
DELIMITER AS '\t' TIMEFORMAT AS 'auto';
SELECT * FROM timestamp_check ORDER BY abbreviation;

結果

abbreviation string timestamp_value timestamptz_value
JST(BASIC0000) 20161020T000000+0900 2016-10-20 00:00:00.000000 2016-10-19 15:00:00+00
JST(BASIC0900) 20161020T090000+0900 2016-10-20 09:00:00.000000 2016-10-20 00:00:00+00
JST(Extended0000) 2016-10-21T00:00:00+09:00 2016-10-21 00:00:00.000000 2016-10-20 15:00:00+00
JST(Extended0900) 2016-10-21T09:00:00+09:00 2016-10-21 09:00:00.000000 2016-10-21 00:00:00+00
UTC(BASIC0000) 20161020T000000Z 2016-10-20 00:00:00.000000 2016-10-20 00:00:00+00
UTC(BASIC0900) 20161020T090000Z 2016-10-20 09:00:00.000000 2016-10-20 09:00:00+00
UTC(Extended0000) 2016-10-21T00:00:00Z 2016-10-21 00:00:00.000000 2016-10-21 00:00:00+00
UTC(Extended0900) 2016-10-21T09:00:00Z 2016-10-21 09:00:00.000000 2016-10-21 09:00:00+00

まず、今まであった型のTIMESTAMPの方はタイムゾーンを反映していないため、JSTとUTCで本来は異なる時間のはずが同一の値になっていることがわかります。この点においてTIMESTAMPTZを用いることで、タイムゾーンを反映させた値で取り込まれていることがわかります。
次に、TIMESTAMPTZなのですが以前この機能が実装されたときはタイムゾーン付きで取り込まれるものと思いこんでいました。 しかし、結果を見てみるとタイムゾーン付きで取り込まれたわけではないことがわかります。
その代わり、JSTの日付は時差を反映した値がUTCで入っていることがわかります。

ここでTIMESTAMPTZの挙動をもう一度確認してみたいと思います。
入力値にタイムゾーンが含まれる場合、Amazon Redshift はタイムゾーンを使用して値を協定世界時 (UTC) に変換し、UTC 値を格納します。 日時型 - Amazon Redshift
よくよく読んでみれば、その通りの挙動をしていたことがわかります。

タイムゾーンを変更した際の挙動の確認

TIMESTAMPTZはユーザーのタイムゾーンに応じた値を返すことができます。

リリースには以下のように記載されています。
You can retrieve and display timestamps in Amazon Redshift by setting your preferred time zone at the session level, user level or client connection level. セッション・ユーザー・コネクションレベルのTimeZoneの値を反映するみたいです。
セッションレベルで変更するのが一番容易かと思いますので、セッションレベルでタイムゾーンの変更を実施し、確認をしてみたいと思います。
テーブルに関しては、上記で作成したテーブルを用います。

データ投入

Sample.tsv

UTC(BASIC0000)  20161025T000000Z    20161025T000000Z    20161025T000000Z
UTC(BASIC0100)  20161025T010000Z    20161025T010000Z    20161025T010000Z
UTC(BASIC0200)  20161025T020000Z    20161025T020000Z    20161025T020000Z
UTC(BASIC0300)  20161025T030000Z    20161025T030000Z    20161025T030000Z
UTC(BASIC0400)  20161025T040000Z    20161025T040000Z    20161025T040000Z
UTC(BASIC0500)  20161025T050000Z    20161025T050000Z    20161025T050000Z
UTC(BASIC0600)  20161025T060000Z    20161025T060000Z    20161025T060000Z
UTC(BASIC0700)  20161025T070000Z    20161025T070000Z    20161025T070000Z
UTC(BASIC0800)  20161025T080000Z    20161025T080000Z    20161025T080000Z
UTC(BASIC0900)  20161025T090000Z    20161025T090000Z    20161025T090000Z
UTC(BASIC1000)  20161025T100000Z    20161025T100000Z    20161025T100000Z
UTC(BASIC1100)  20161025T110000Z    20161025T110000Z    20161025T110000Z
UTC(BASIC1200)  20161025T120000Z    20161025T120000Z    20161025T120000Z
UTC(BASIC1300)  20161025T130000Z    20161025T130000Z    20161025T130000Z
UTC(BASIC1400)  20161025T140000Z    20161025T140000Z    20161025T140000Z
UTC(BASIC1500)  20161025T150000Z    20161025T150000Z    20161025T150000Z
UTC(BASIC1600)  20161025T160000Z    20161025T160000Z    20161025T160000Z
UTC(BASIC1700)  20161025T170000Z    20161025T170000Z    20161025T170000Z
UTC(BASIC1800)  20161025T180000Z    20161025T180000Z    20161025T180000Z
UTC(BASIC1900)  20161025T190000Z    20161025T190000Z    20161025T190000Z
UTC(BASIC2000)  20161025T200000Z    20161025T200000Z    20161025T200000Z
UTC(BASIC2100)  20161025T210000Z    20161025T210000Z    20161025T210000Z
UTC(BASIC2200)  20161025T220000Z    20161025T220000Z    20161025T220000Z
UTC(BASIC2300)  20161025T230000Z    20161025T230000Z    20161025T230000Z

確認

DELETE * FROM timestamp_check;
COPY timestamp_check 
(abbreviation,string,timestamp_value,timestamptz_value) 
FROM 's3://cm-kajiwara-redshift-load/Sample.tsv'  
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/redshift-role' 
DELIMITER AS '\t' TIMEFORMAT AS 'auto';
SET timezone to JST;
SELECT * FROM timestamp_check;

結果

abbreviation string timestamp_value timestamptz_value
JST(BASIC0000) 20161025T000000+0900 2016-10-25 00:00:00.000000 2016-10-25 00:00:00+09
JST(BASIC0100) 20161025T010000+0900 2016-10-25 01:00:00.000000 2016-10-25 01:00:00+09
JST(BASIC0200) 20161025T020000+0900 2016-10-25 02:00:00.000000 2016-10-25 02:00:00+09
JST(BASIC0300) 20161025T030000+0900 2016-10-25 03:00:00.000000 2016-10-25 03:00:00+09
JST(BASIC0400) 20161025T040000+0900 2016-10-25 04:00:00.000000 2016-10-25 04:00:00+09
JST(BASIC0500) 20161025T050000+0900 2016-10-25 05:00:00.000000 2016-10-25 05:00:00+09
JST(BASIC0600) 20161025T060000+0900 2016-10-25 06:00:00.000000 2016-10-25 06:00:00+09
JST(BASIC0700) 20161025T070000+0900 2016-10-25 07:00:00.000000 2016-10-25 07:00:00+09
JST(BASIC0800) 20161025T080000+0900 2016-10-25 08:00:00.000000 2016-10-25 08:00:00+09
JST(BASIC0900) 20161025T090000+0900 2016-10-25 09:00:00.000000 2016-10-25 09:00:00+09
JST(BASIC1000) 20161025T100000+0900 2016-10-25 10:00:00.000000 2016-10-25 10:00:00+09
JST(BASIC1100) 20161025T110000+0900 2016-10-25 11:00:00.000000 2016-10-25 11:00:00+09
JST(BASIC1200) 20161025T120000+0900 2016-10-25 12:00:00.000000 2016-10-25 12:00:00+09
JST(BASIC1300) 20161025T130000+0900 2016-10-25 13:00:00.000000 2016-10-25 13:00:00+09
JST(BASIC1400) 20161025T140000+0900 2016-10-25 14:00:00.000000 2016-10-25 14:00:00+09
JST(BASIC1500) 20161025T150000+0900 2016-10-25 15:00:00.000000 2016-10-25 15:00:00+09
JST(BASIC1600) 20161025T160000+0900 2016-10-25 16:00:00.000000 2016-10-25 16:00:00+09
JST(BASIC1700) 20161025T170000+0900 2016-10-25 17:00:00.000000 2016-10-25 17:00:00+09
JST(BASIC1800) 20161025T180000+0900 2016-10-25 18:00:00.000000 2016-10-25 18:00:00+09
JST(BASIC1900) 20161025T190000+0900 2016-10-25 19:00:00.000000 2016-10-25 19:00:00+09
JST(BASIC2000) 20161025T200000+0900 2016-10-25 20:00:00.000000 2016-10-25 20:00:00+09
JST(BASIC2100) 20161025T210000+0900 2016-10-25 21:00:00.000000 2016-10-25 21:00:00+09
JST(BASIC2200) 20161025T220000+0900 2016-10-25 22:00:00.000000 2016-10-25 22:00:00+09
JST(BASIC2300) 20161025T230000+0900 2016-10-25 23:00:00.000000 2016-10-25 23:00:00+09
UTC(BASIC0000) 20161025T000000Z 2016-10-25 00:00:00.000000 2016-10-25 09:00:00+09
UTC(BASIC0100) 20161025T010000Z 2016-10-25 01:00:00.000000 2016-10-25 10:00:00+09
UTC(BASIC0200) 20161025T020000Z 2016-10-25 02:00:00.000000 2016-10-25 11:00:00+09
UTC(BASIC0300) 20161025T030000Z 2016-10-25 03:00:00.000000 2016-10-25 12:00:00+09
UTC(BASIC0400) 20161025T040000Z 2016-10-25 04:00:00.000000 2016-10-25 13:00:00+09
UTC(BASIC0500) 20161025T050000Z 2016-10-25 05:00:00.000000 2016-10-25 14:00:00+09
UTC(BASIC0600) 20161025T060000Z 2016-10-25 06:00:00.000000 2016-10-25 15:00:00+09
UTC(BASIC0700) 20161025T070000Z 2016-10-25 07:00:00.000000 2016-10-25 16:00:00+09
UTC(BASIC0800) 20161025T080000Z 2016-10-25 08:00:00.000000 2016-10-25 17:00:00+09
UTC(BASIC0900) 20161025T090000Z 2016-10-25 09:00:00.000000 2016-10-25 18:00:00+09
UTC(BASIC1000) 20161025T100000Z 2016-10-25 10:00:00.000000 2016-10-25 19:00:00+09
UTC(BASIC1100) 20161025T110000Z 2016-10-25 11:00:00.000000 2016-10-25 20:00:00+09
UTC(BASIC1200) 20161025T120000Z 2016-10-25 12:00:00.000000 2016-10-25 21:00:00+09
UTC(BASIC1300) 20161025T130000Z 2016-10-25 13:00:00.000000 2016-10-25 22:00:00+09
UTC(BASIC1400) 20161025T140000Z 2016-10-25 14:00:00.000000 2016-10-25 23:00:00+09
UTC(BASIC1500) 20161025T150000Z 2016-10-25 15:00:00.000000 2016-10-26 00:00:00+09
UTC(BASIC1600) 20161025T160000Z 2016-10-25 16:00:00.000000 2016-10-26 01:00:00+09
UTC(BASIC1700) 20161025T170000Z 2016-10-25 17:00:00.000000 2016-10-26 02:00:00+09
UTC(BASIC1800) 20161025T180000Z 2016-10-25 18:00:00.000000 2016-10-26 03:00:00+09
UTC(BASIC1900) 20161025T190000Z 2016-10-25 19:00:00.000000 2016-10-26 04:00:00+09
UTC(BASIC2000) 20161025T200000Z 2016-10-25 20:00:00.000000 2016-10-26 05:00:00+09
UTC(BASIC2100) 20161025T210000Z 2016-10-25 21:00:00.000000 2016-10-26 06:00:00+09
UTC(BASIC2200) 20161025T220000Z 2016-10-25 22:00:00.000000 2016-10-26 07:00:00+09
UTC(BASIC2300) 20161025T230000Z 2016-10-25 23:00:00.000000 2016-10-26 08:00:00+09

SET句を用いてtimezoneの値を設定することで、先ほどはUTCで表示されていた値がJST表記になっていることがわかります。

今まで、TIMESTAMPを用いてタイムゾーンが異なるデータを取り込もうとするとCOPYコマンドでRedshiftで取り込む前に、 ETL処理を実施してUTCに寄せるといった作業が必要でした。
また、そういった作業を行わないで取り込もうとすると、 異なるタイムゾーンで同一である時間のはずが異なる時間として取り込まれる事になっていました。
上記の例で言うと、JST(BASIC0900)とUTC(BASIC0000)は本来ならば同じ時間のはずですが、
TIMESTAMP型で取り込んだtimestamp_valueの値は異なっていることがわかります。
逆にtimestampz_valueの値は同一であることは確認できます。

タイムゾーンの表記のあるデータを取り込む際に以前はETL処理を実施していたケースもあるとは思いますが、
TIMESTAMPTZを用いることで、それらの手間を省くことができます。

また、TIMESTAMPのため、JSTのをUTCでに変換して取り込んでいた場合後にJST準拠で分析しようとすると、 今度は抽出クエリで9時間足した日付を出すといったことをする必要がありましたが、 TIMESTAMPTZを用いると時間の加算といった処理は不要となります。
下記に同一のデータでタイムゾーンを切り替えた例を載せておきます。
今回の例ではタイムゾーンをJSTとすれば、UTC(BASIC1600)以降が翌日に、UTCとすれば、JST(BASIC0800)以前が前日となっていることがわかります。

データ確認(JST)

SET timezone to 'Asia/Tokyo';
SELECT abbreviation,string,timestamptz_value,to_date(timestamptz_value, 'YYYY/MM/DD') FROM timestamp_check ORDER BY timestamptz_value,abbreviation;

結果

abbreviation string timestamptz_value to_date
JST(BASIC0000) 20161025T000000+0900 2016-10-25 00:00:00+09 2016-10-25
JST(BASIC0100) 20161025T010000+0900 2016-10-25 01:00:00+09 2016-10-25
JST(BASIC0200) 20161025T020000+0900 2016-10-25 02:00:00+09 2016-10-25
JST(BASIC0300) 20161025T030000+0900 2016-10-25 03:00:00+09 2016-10-25
JST(BASIC0400) 20161025T040000+0900 2016-10-25 04:00:00+09 2016-10-25
JST(BASIC0500) 20161025T050000+0900 2016-10-25 05:00:00+09 2016-10-25
JST(BASIC0600) 20161025T060000+0900 2016-10-25 06:00:00+09 2016-10-25
JST(BASIC0700) 20161025T070000+0900 2016-10-25 07:00:00+09 2016-10-25
JST(BASIC0800) 20161025T080000+0900 2016-10-25 08:00:00+09 2016-10-25
JST(BASIC0900) 20161025T090000+0900 2016-10-25 09:00:00+09 2016-10-25
UTC(BASIC0000) 20161025T000000Z 2016-10-25 09:00:00+09 2016-10-25
JST(BASIC1000) 20161025T100000+0900 2016-10-25 10:00:00+09 2016-10-25
UTC(BASIC0100) 20161025T010000Z 2016-10-25 10:00:00+09 2016-10-25
JST(BASIC1100) 20161025T110000+0900 2016-10-25 11:00:00+09 2016-10-25
UTC(BASIC0200) 20161025T020000Z 2016-10-25 11:00:00+09 2016-10-25
JST(BASIC1200) 20161025T120000+0900 2016-10-25 12:00:00+09 2016-10-25
UTC(BASIC0300) 20161025T030000Z 2016-10-25 12:00:00+09 2016-10-25
JST(BASIC1300) 20161025T130000+0900 2016-10-25 13:00:00+09 2016-10-25
UTC(BASIC0400) 20161025T040000Z 2016-10-25 13:00:00+09 2016-10-25
JST(BASIC1400) 20161025T140000+0900 2016-10-25 14:00:00+09 2016-10-25
UTC(BASIC0500) 20161025T050000Z 2016-10-25 14:00:00+09 2016-10-25
JST(BASIC1500) 20161025T150000+0900 2016-10-25 15:00:00+09 2016-10-25
UTC(BASIC0600) 20161025T060000Z 2016-10-25 15:00:00+09 2016-10-25
JST(BASIC1600) 20161025T160000+0900 2016-10-25 16:00:00+09 2016-10-25
UTC(BASIC0700) 20161025T070000Z 2016-10-25 16:00:00+09 2016-10-25
JST(BASIC1700) 20161025T170000+0900 2016-10-25 17:00:00+09 2016-10-25
UTC(BASIC0800) 20161025T080000Z 2016-10-25 17:00:00+09 2016-10-25
JST(BASIC1800) 20161025T180000+0900 2016-10-25 18:00:00+09 2016-10-25
UTC(BASIC0900) 20161025T090000Z 2016-10-25 18:00:00+09 2016-10-25
JST(BASIC1900) 20161025T190000+0900 2016-10-25 19:00:00+09 2016-10-25
UTC(BASIC1000) 20161025T100000Z 2016-10-25 19:00:00+09 2016-10-25
JST(BASIC2000) 20161025T200000+0900 2016-10-25 20:00:00+09 2016-10-25
UTC(BASIC1100) 20161025T110000Z 2016-10-25 20:00:00+09 2016-10-25
JST(BASIC2100) 20161025T210000+0900 2016-10-25 21:00:00+09 2016-10-25
UTC(BASIC1200) 20161025T120000Z 2016-10-25 21:00:00+09 2016-10-25
JST(BASIC2200) 20161025T220000+0900 2016-10-25 22:00:00+09 2016-10-25
UTC(BASIC1300) 20161025T130000Z 2016-10-25 22:00:00+09 2016-10-25
JST(BASIC2300) 20161025T230000+0900 2016-10-25 23:00:00+09 2016-10-25
UTC(BASIC1400) 20161025T140000Z 2016-10-25 23:00:00+09 2016-10-25
UTC(BASIC1500) 20161025T150000Z 2016-10-26 00:00:00+09 2016-10-26
UTC(BASIC1600) 20161025T160000Z 2016-10-26 01:00:00+09 2016-10-26
UTC(BASIC1700) 20161025T170000Z 2016-10-26 02:00:00+09 2016-10-26
UTC(BASIC1800) 20161025T180000Z 2016-10-26 03:00:00+09 2016-10-26
UTC(BASIC1900) 20161025T190000Z 2016-10-26 04:00:00+09 2016-10-26
UTC(BASIC2000) 20161025T200000Z 2016-10-26 05:00:00+09 2016-10-26
UTC(BASIC2100) 20161025T210000Z 2016-10-26 06:00:00+09 2016-10-26
UTC(BASIC2200) 20161025T220000Z 2016-10-26 07:00:00+09 2016-10-26
UTC(BASIC2300) 20161025T230000Z 2016-10-26 08:00:00+09 2016-10-26

データ確認(UTC)

SET timezone to 'UTC';
SELECT abbreviation,string,timestamptz_value,to_date(timestamptz_value, 'YYYY/MM/DD') FROM timestamp_check ORDER BY timestamptz_value,abbreviation;

結果

abbreviation string timestamptz_value to_date
JST(BASIC0000) 20161025T000000+0900 2016-10-24 15:00:00+00 2016-10-24
JST(BASIC0100) 20161025T010000+0900 2016-10-24 16:00:00+00 2016-10-24
JST(BASIC0200) 20161025T020000+0900 2016-10-24 17:00:00+00 2016-10-24
JST(BASIC0300) 20161025T030000+0900 2016-10-24 18:00:00+00 2016-10-24
JST(BASIC0400) 20161025T040000+0900 2016-10-24 19:00:00+00 2016-10-24
JST(BASIC0500) 20161025T050000+0900 2016-10-24 20:00:00+00 2016-10-24
JST(BASIC0600) 20161025T060000+0900 2016-10-24 21:00:00+00 2016-10-24
JST(BASIC0700) 20161025T070000+0900 2016-10-24 22:00:00+00 2016-10-24
JST(BASIC0800) 20161025T080000+0900 2016-10-24 23:00:00+00 2016-10-24
JST(BASIC0900) 20161025T090000+0900 2016-10-25 00:00:00+00 2016-10-25
UTC(BASIC0000) 20161025T000000Z 2016-10-25 00:00:00+00 2016-10-25
JST(BASIC1000) 20161025T100000+0900 2016-10-25 01:00:00+00 2016-10-25
UTC(BASIC0100) 20161025T010000Z 2016-10-25 01:00:00+00 2016-10-25
JST(BASIC1100) 20161025T110000+0900 2016-10-25 02:00:00+00 2016-10-25
UTC(BASIC0200) 20161025T020000Z 2016-10-25 02:00:00+00 2016-10-25
JST(BASIC1200) 20161025T120000+0900 2016-10-25 03:00:00+00 2016-10-25
UTC(BASIC0300) 20161025T030000Z 2016-10-25 03:00:00+00 2016-10-25
JST(BASIC1300) 20161025T130000+0900 2016-10-25 04:00:00+00 2016-10-25
UTC(BASIC0400) 20161025T040000Z 2016-10-25 04:00:00+00 2016-10-25
JST(BASIC1400) 20161025T140000+0900 2016-10-25 05:00:00+00 2016-10-25
UTC(BASIC0500) 20161025T050000Z 2016-10-25 05:00:00+00 2016-10-25
JST(BASIC1500) 20161025T150000+0900 2016-10-25 06:00:00+00 2016-10-25
UTC(BASIC0600) 20161025T060000Z 2016-10-25 06:00:00+00 2016-10-25
JST(BASIC1600) 20161025T160000+0900 2016-10-25 07:00:00+00 2016-10-25
UTC(BASIC0700) 20161025T070000Z 2016-10-25 07:00:00+00 2016-10-25
JST(BASIC1700) 20161025T170000+0900 2016-10-25 08:00:00+00 2016-10-25
UTC(BASIC0800) 20161025T080000Z 2016-10-25 08:00:00+00 2016-10-25
JST(BASIC1800) 20161025T180000+0900 2016-10-25 09:00:00+00 2016-10-25
UTC(BASIC0900) 20161025T090000Z 2016-10-25 09:00:00+00 2016-10-25
JST(BASIC1900) 20161025T190000+0900 2016-10-25 10:00:00+00 2016-10-25
UTC(BASIC1000) 20161025T100000Z 2016-10-25 10:00:00+00 2016-10-25
JST(BASIC2000) 20161025T200000+0900 2016-10-25 11:00:00+00 2016-10-25
UTC(BASIC1100) 20161025T110000Z 2016-10-25 11:00:00+00 2016-10-25
JST(BASIC2100) 20161025T210000+0900 2016-10-25 12:00:00+00 2016-10-25
UTC(BASIC1200) 20161025T120000Z 2016-10-25 12:00:00+00 2016-10-25
JST(BASIC2200) 20161025T220000+0900 2016-10-25 13:00:00+00 2016-10-25
UTC(BASIC1300) 20161025T130000Z 2016-10-25 13:00:00+00 2016-10-25
JST(BASIC2300) 20161025T230000+0900 2016-10-25 14:00:00+00 2016-10-25
UTC(BASIC1400) 20161025T140000Z 2016-10-25 14:00:00+00 2016-10-25
UTC(BASIC1500) 20161025T150000Z 2016-10-25 15:00:00+00 2016-10-25
UTC(BASIC1600) 20161025T160000Z 2016-10-25 16:00:00+00 2016-10-25
UTC(BASIC1700) 20161025T170000Z 2016-10-25 17:00:00+00 2016-10-25
UTC(BASIC1800) 20161025T180000Z 2016-10-25 18:00:00+00 2016-10-25
UTC(BASIC1900) 20161025T190000Z 2016-10-25 19:00:00+00 2016-10-25
UTC(BASIC2000) 20161025T200000Z 2016-10-25 20:00:00+00 2016-10-25
UTC(BASIC2100) 20161025T210000Z 2016-10-25 21:00:00+00 2016-10-25
UTC(BASIC2200) 20161025T220000Z 2016-10-25 22:00:00+00 2016-10-25
UTC(BASIC2300) 20161025T230000Z 2016-10-25 23:00:00+00 2016-10-25

結論

挙動について理解をしておく必要はありますがtimestamptzをうまく利用することで、
ETL処理無しでのタイムスタンプ付きのデータの取り込みやタイムゾーンを切り替えてのデータ分析等が行えそうです。

脚注