間違いだらけの備忘録

このページの内容は無保証でありこのページの内容によって直接、または間接に損害を受けられたとしても私は責任を取りません。

日付仕様

テストデータ
http://mono-space.net/jpug_study.txt

以下はエラー
select south.t, min(east.t) , min(east.t) - south.t
from east,south
where (east.t > (south.t +  time '00:10'))
group by south.t
;

ERROR:  operator is not unique: time without time zone + time without time zone
HINT:  Could not choose a best candidate operator. You may need to add explicit type casts.
これは通る
select south.t, min(east.t) , min(east.t) - south.t
from east,south
where (east.t > (south.t +  '00:10'::interval))
group by south.t
;

これも通る
select south.t, min(east.t) , min(east.t) - south.t
from east,south
where (east.t > (south.t + '3 minutes'::interval))
group by south.t
;

日付と日付の差分はinterval型であり、integer型ではない。
そのため、日付と加算、減産できるのはinterval型('00:10'::interval等で表現)
となる
日付とintegerの変換を行いたい場合には、epochを使用する。
http://osb.sra.co.jp/PostgreSQL/Manual/PostgreSQL-8.1-ja/functions-datetime.html

epoch

date型とtimestamp型の値において、1970-01-01 00:00:00からの秒数(負の数の場合もあり)。interval型の値ではその時間間隔における秒の合計。

SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-08');
Result: 982384720

SELECT EXTRACT(EPOCH FROM INTERVAL '5 days 3 hours');
Result: 442800

以下に、この経過秒数をタイムスタンプ値に変換する方法を示します。

SELECT TIMESTAMP WITH TIME ZONE 'epoch' + 982384720 * INTERVAL '1 second';

このページにはhatena以外のサービスからのコンテンツが埋め込まれています。 hatenaによりGoogle AdSense 広告が埋め込まれています。