时间段的数据类型

时间:2013-01-20 23:33:32

标签: postgresql postgresql-9.1

我想在表格列中插入时间段。例如:我有一个包含7列的表,每列是一周中的一天。是否有可能创建一个数据类型,这是员工工作时间的时间段?让我们说从凌晨1点到早上8点。或者在24小时制中。

如果没有,我应该如何处理?

1 个答案:

答案 0 :(得分: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

将数据排列到矩阵中是一个表示级问题。使用应用程序代码来做到这一点。

您可以用于此类查询的最简单的日历表只有两列。 (我使用英语。根据需要调整缩写,但它们必须与“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文件等。