0

テーブルの列に期間を挿入したいと思います。例: 7 列のテーブルがあり、各列は曜日です。従業員の勤務時間の期間であるデータ型を作成する可能性はありますか? 午前1時から午前8時までとしましょう。または24時間体制で。

ない場合、どのように対処すればよいですか?

4

1 に答える 1

1

営業時間などの表を作成している場合は、列を少なくした方がよいでしょう。

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 ファイルを生成するスクリプト言語など、さまざまな方法があります。

于 2013-01-21T01:54:03.683 に答える