我想在表格列中插入时间段。例如:我有一个有 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
将这些数据排列成矩阵是一个表示级别的问题。使用应用程序代码来做到这一点。
可用于此类查询的最简单的日历表只有两列。(我的使用英文。根据需要调整缩写,但它们必须与“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 文件的脚本语言等。