PostgreSQL で 24:00 と 0:00 を扱う
問題の趣旨を理解できていないかもしれませんが。
これができないから、いつまでたっても、Date型とか使わずにcharやnumberな日付時刻カラムがなくならないんだよな。
夜勤帯が存在するような業務の場合、「当日の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)
| 固定リンク
この記事へのコメントは終了しました。
コメント