普段PostgreSQLを使っている私が、Prestoで躓いたTimestampの処理について列挙します。
#DATE_PART関数がありません
DATE_FRORMAT関数を使えばいいのですが、戻り値が文字列型であるため、後工程で数値演算する際にはキャスト処理が必要になるのでちょっと使いにくく感じます。
しかし、Prestoにもタイムスタンプの一部を数値型で切り出す関数がございます。詳しくは英語のドキュメントを参照していただければと思いますが、感覚で覚えている方は、下記のようなパターンで置き換えられます。
###例 TIMESTAMPから曜日番号の抽出
PostgreSQL
DATE_PART('dow' , timestamp )
Persto
dow( timestamp )
または day_of_week( timestamp )
###例 TIMESTAMPから時間を抽出
PostgreSQL
DATE_PART('hour' , timestamp )
Persto
HOUR( timestamp )
#COUNT関数の中にDATE_TRUNC関数を入れるとエラー
Prestoでは、COUNT関数は数値型・文字列型のデータには対応しておりますが、timestamp型のデータを投入するとエラーが生じます。
日別・月別などの集計を実施する際は、format_datetimeを用いて文字列型で所望の単位のタイムスタンプを生成するのがいいようです。
PostgreSQLで1時間単位のカウント
SELECT COUNT( date_trunc('hour' , timestamp) );
Prestoで1時間単位のカウント
SELECT COUNT( format_datetime(timestamp,'%Y%m%d%H') );
#TIME ZONEの設定
Prestoにはデータ型には、TIMESTAMPとTIMESTAMP WITH TIME ZONE の2種類であり、明示的なTIMESTAMP WITHOUT TIME ZONE型はございません。
####実験:now() 関数でのタイムゾーンと型
SELECT now();
-- 2014-11-08 12:59:29.091 UTC
-- 型:Timestamp with time zone
UTC(協定世界時、グリニッジ標準時)の時刻が出力されました。日本に住む私とは9時間遅い時刻です。
####AT TIME ZONE 修飾子によるタイムゾーン指定
PostgreSQLにも実装されているAT TIME ZONEを用いてUTCを日本標準時(JST)に変更してみます。
SELECT now() AT TIME ZONE 'Asia/Tokyo';
-- 2014-11-08 21:59:29.091 Asia/Tokyo
-- 型:Timestamp with time zone
上手く変換出来ました。