数据库为SQL2000
创建表的SQL语句如下:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[DutyShift]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[DutyShift]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Workplace]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[Workplace]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[employee]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[employee]
GO
CREATE TABLE [dbo].[DutyShift] (
[DutyShiftID] [int] IDENTITY (1, 1) NOT NULL ,
[DutyShift] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[DutyShiftAB] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[Remark] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Workplace] (
[WorkplaceID] [int] IDENTITY (1, 1) NOT NULL ,
[Workplace] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[Remark] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[employee] (
[EmployeeID] [int] IDENTITY (1, 1) NOT NULL ,
[FullName] [nvarchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[WorkplaceID] [int] NOT NULL ,
[Monitor] [bit] NOT NULL ,
[Remark] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
各个表的内容如下:
DutyShift
1 早班监控 A
2 晚班监控 B
3 早班机动 F
4 晚班机动 H
5 高峰班 C
6 休息 O
employee
1 张三 1 1
2 李四 1 1
3 周七 4 1
4 王五 4 0
5 朱六 2 0
6 黄二 3 0
Workplace
1 资阳
2 简阳
3 内江
4 遂宁
要求如下:
1、地点1、地点2、地点3、地点4四个地点上班,地点1和地点4是分别有2人上班,地点2和地点3只有一人上班。
2、班次有早班机动(用字母F表示 8:30-17:00)、晚班机动(用字母H表示 17:30-2:00)、早班监控(用字母A表示 8:00-16:30)、晚班监控(用字母B表示 16:30-1:00)、高峰班(用字母C表示)、休息(用字母O表示)。每个班次是8小时上班时间、每个季度上够500个小时。
3、地点1上班的2人加上地点4上班的1人共三个人负责上监控班(即 早班监控、晚班监控)。(注:他们三人可以上早班机动和晚班机动,其他人不能上早班监控和晚班监控)
4、每天必须有人上早班监控和晚班监控,必须至少有一人上早班,一人上晚班(同一上班地点不能同时有人上早班机动和早班监控,同样不能同时有人上晚班机动和晚班监控)
5、当天晚班(或者监控晚班)第二天不能上早班(或者早班监控),在一个地点上班的人,不能一直都是一个班,要早班晚班兼顾。
6、每周星期四需要两个人上晚班(有一个必须是晚班监控,另一个是晚班机动)。
7、连续上班不能超过5天,不能连续上3个晚班(晚班机动或者晚班监控)。
8、周五到周日是高峰期每个地点尽量保持有人上班。
9、排出来的班表不需要存储,需要存储的信息只有人员 班次名称 上班地点。
10、只需要排班不需要考虑考勤和签到的问题。
最后呈现的效果图如下: