PrestoのDateとTime関数・操作について


普段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 

上手く変換出来ました。