Pages

2017年3月10日金曜日

PostgreSQLのEXTRACT関数に苦戦中

 こんにちは、例の新人です。

 PostgreSQLのEXTRACT関数の設定で苦戦しています。

 PostgreSQLでは、「EXTRACT(EPOCH FROM [時刻])」の構文で1970-01-01 00:00:00からの秒数、つまりUNIXTIMEを取得できるのですが、この設定の場合どうやらマイクロ秒が正確に表示できないようです。

 例えば、次のような構文で「2017-03-10 16:55:26.114877」というマイクロ秒を含んだ時刻をUNIXTIME化してみます。

SELECT EXTRACT(EPOCH FROM TO_TIMESTAMP('2017-03-10 16:55:26.114877','YYYY-MM-DD HH24:MI:SS.US'));

 結果は以下のようになります。

    date_part  
------------------
 1489132526.11488

 マイクロ秒部分「114877」の小数点以下第6位が四捨五入されてしまいました。これを、以下の構文からTIMESTAMPに直してみます。

SELECT TO_TIMESTAMP(1489132526.11488) AT TIME ZONE 'UTC';

 結果は以下の通りになります。

         timezone        
---------------------------
 2017-03-10 07:55:26.11488

 元々の時間より、0.000003秒遅くなってしまいました。最初の時刻とUNIXTIMEにしたものを戻した時刻を同じにしたいため、このままではいけません。

 下のようなTIMESTAMPをUNIXTIMEに直した後またTIMESTAMPに直す動作をひとまとめにした構文では、元の時刻とUNIXTIMEをTIMESTAMPに復元した時刻が一応は一致します。しかし、この設定は実際の作業では使えません。

SELECT TO_TIMESTAMP(EXTRACT(EPOCH FROM TO_TIMESTAMP('2017-03-10 16:55:26.114877','YYYY-MM-DD HH24:MI:SS.US')  AT TIME ZONE 'UTC')) ;

 結果は以下の通りになります。

         to_timestamp        
-------------------------------
 2017-03-10 16:55:26.114877+09

 同一の時刻としてUNIXTIMEを取得する方法を模索中です。

0 件のコメント:

コメントを投稿