スケジューリングのニーズがどれほど複雑かによって、データの保存方法に関するアイデアについて、iCalendarスケジューリング データ形式であるRFC 5545を参照することをお勧めします。
ニーズが非常に単純な場合、それはおそらくやり過ぎです。Postgresql には、日付と時刻を必要な形式に変換する関数が多数あります。
相対的な日付と時刻を保存する簡単な方法として、提案したように曜日を整数として保存し、時間をTIME
データ型として保存できます。有効な曜日が複数ある場合は、ARRAY を使用することをお勧めします。
例えば。
- ARRAY[2,3]::INTEGER[] = 火曜日、水曜日を曜日として
- '15:00:00'::TIME = 午後 3 時
[編集:いくつかの簡単な例を追加]
/* Custom the time and timetz range types */
CREATE TYPE timerange AS RANGE (subtype = time);
--drop table if exists schedule;
create table schedule (
event_id integer not null, /* should be an FK to "events" table */
day_of_week integer[],
time_of_day time,
time_range timerange,
recurring text CHECK (recurring IN ('DAILY','WEEKLY','MONTHLY','YEARLY'))
);
insert into schedule (event_id, day_of_week, time_of_day, time_range, recurring)
values
(1, ARRAY[1,2,3,4,5]::INTEGER[], '15:00:00'::TIME, NULL, 'WEEKLY'),
(2, ARRAY[6,0]::INTEGER[], NULL, '(08:00:00,17:00:00]'::timerange, 'WEEKLY');
select * from schedule;
event_id | day_of_week | time_of_day | time_range | recurring
----------+-------------+-------------+---------------------+-----------
1 | {1,2,3,4,5} | 15:00:00 | | WEEKLY
2 | {6,0} | | (08:00:00,17:00:00] | WEEKLY
最初のエントリは次のように読むことができます: イベントは月曜日から金曜日の午後 3 時に有効で、このスケジュールは毎週発生します。
2 番目のエントリは、次のように読むことができます: イベントは毎週土曜日と日曜日の午前 8 時から午後 5 時まで有効です。
カスタム範囲タイプ「timerange」は、時間範囲の下限と上限を示すために使用されます。
「(」は「包括的」を意味し、末尾の「]」は「排他的」、つまり「午前 8 時以上午後 5 時未満」を意味します。