« Java SE 7 は .NET アセンブリの夢を見るのか | トップページ | 回線速度の計測 ( その2 ) »

2009年3月 7日 (土)

PostgreSQL で 24:00 と 0:00 を扱う

問題の趣旨を理解できていないかもしれませんが。

これができないから、いつまでたっても、Date型とか使わずにcharやnumberな日付時刻カラムがなくならないんだよな。

BusinessDateTime型 - L'eclat des jours (2009-03-06)

夜勤帯が存在するような業務の場合、「当日の24:00」と「翌日の0:00」を区別したい、という話は出てきますね。

日付と時刻を分割するしかないんじゃないですかねえ。

PostgreSQL ですと、こんな感じになります。

create table t_event(
ev_id serial,
ev_date date,
ev_interval interval,
ev_str varchar(10),
primary key (ev_id) );

insert into t_event(
ev_date,
ev_interval,
ev_str)
values(
'2009-01-31',
'24:01:00',
'event1');

insert into t_event(
ev_date,
ev_interval,
ev_str)
values(
'2009-02-01',
'00:00:00',
'event2');

insert into t_event(
ev_date,
ev_interval,
ev_str)
values(
'2009-02-01',
'00:01:00',
'event3');

select *
from t_event
order by ev_date, ev_interval;

 ev_id |  ev_date   | ev_interval | ev_str
-------+------------+-------------+--------
     1 | 2009-01-31 | 24:01:00    | event1
     2 | 2009-02-01 | 00:00:00    | event2
     3 | 2009-02-01 | 00:01:00    | event3
(3 rows)

select
ev_date + ev_interval as normalize,
ev_str
from t_event
order by ev_date, ev_interval;

      normalize      | ev_str
---------------------+--------
 2009-02-01 00:01:00 | event1
 2009-02-01 00:00:00 | event2
 2009-02-01 00:01:00 | event3
(3 rows)

select
ev_date::varchar || ' ' || ev_interval::varchar as to_s,
ev_str
from t_event
order by ev_date, ev_interval;

        to_s         | ev_str
---------------------+--------
 2009-01-31 24:01:00 | event1
 2009-02-01 00:00:00 | event2
 2009-02-01 00:01:00 | event3
(3 rows)

select
ev_date - 1 as round_date,
ev_interval + '24:00:00' as round_interval,
ev_str
from t_event
where ev_id = 3
order by ev_date, ev_interval;

 round_date | round_interval | ev_str
------------+----------------+--------
 2009-01-31 | 24:01:00       | event3
(1 row)

|

« Java SE 7 は .NET アセンブリの夢を見るのか | トップページ | 回線速度の計測 ( その2 ) »

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/80472/28505354

この記事へのトラックバック一覧です: PostgreSQL で 24:00 と 0:00 を扱う:

« Java SE 7 は .NET アセンブリの夢を見るのか | トップページ | 回線速度の計測 ( その2 ) »