テーブルの列に期間を挿入したいと思います。例: 7 列のテーブルがあり、各列は曜日です。従業員の勤務時間の期間であるデータ型を作成する可能性はありますか? 午前1時から午前8時までとしましょう。または24時間体制で。
ない場合、どのように対処すればよいですか?
テーブルの列に期間を挿入したいと思います。例: 7 列のテーブルがあり、各列は曜日です。従業員の勤務時間の期間であるデータ型を作成する可能性はありますか? 午前1時から午前8時までとしましょう。または24時間体制で。
ない場合、どのように対処すればよいですか?
営業時間などの表を作成している場合は、列を少なくした方がよいでしょう。
create table business_hours (
day_of_week char(3) not null unique
check (day_of_week in ('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun')),
start_time time not null,
end_time time not null
check (end_time > start_time)
);
insert into business_hours values
('Mon', '09:00', '17:00'),
('Tue', '09:00', '17:00'),
('Wed', '09:00', '17:00'),
('Thu', '09:00', '17:00'),
('Fri', '09:00', '17:00'),
('Sat', '11:00', '15:00');
そのテーブルをカレンダー テーブルと結合 (またはその場で generate_series() を使用してカレンダー テーブルを作成) し、現在の週の営業時間を生成できます。
select c.cal_date, bh.*
from calendar c
inner join business_hours bh on bh.day_of_week = c.day_of_week
where cal_date between '2013-01-20' and '2013-01-27'
order by cal_date
そのデータをマトリックスに配置することは、プレゼンテーション レベルの問題です。これを行うには、アプリケーション コードを使用します。
この種のクエリに使用できる最も単純なカレンダー テーブルには、2 つの列しかありません。(私は英語を使用しています。略語はお好みで調整してください。ただし、テーブル「business_hours」の略語と一致する必要があります。)
CREATE TABLE calendar
(
cal_date date NOT NULL,
day_of_week character(3) NOT NULL,
CONSTRAINT cal_pkey PRIMARY KEY (cal_date),
CONSTRAINT cal_dow_values CHECK (day_of_week =
CASE
WHEN date_part('dow', cal_date) = 0 THEN 'Sun'
WHEN date_part('dow', cal_date) = 1 THEN 'Mon'
WHEN date_part('dow', cal_date) = 2 THEN 'Tue'
WHEN date_part('dow', cal_date) = 3 THEN 'Wed'
WHEN date_part('dow', cal_date) = 4 THEN 'Thu'
WHEN date_part('dow', cal_date) = 5 THEN 'Fri'
WHEN date_part('dow', cal_date) = 6 THEN 'Sat'
ELSE NULL
END)
);
CREATE INDEX ON calendar (day_of_week);
カレンダー テーブルにデータを入力するには、スプレッドシート、PostgreSQL 関数、CSV ファイルを生成するスクリプト言語など、さまざまな方法があります。