作者asklove (冰焰圣龙)
看板Database
标题[SQL ] 如何设计排班表
时间Fri May 28 21:05:45 2010
我先说这不是作业 = = 这是为了让单位的排班能比较顺利而想的
想要用 MySQL 资料库来做,然後用SQL语法来产生每个人的班表
可是问题在於找不出规则....
以下只有依需求先规画了4个初步的资料表栏位
以2010/06月为例,有30天
每个人都必须上班22天(因为周休二日,一个月休八天)
一共有6个人要轮班
有四种班别 A B C D
理论上所有的排列组合是 30(天)x6(人)x4(班)
现在我要做出一个系统,好可以轻松的产生比较公平的排班表
以免每个月大家在那边吵....
当然系统要用ASP、PHP、VB、JAVA或其他东西来写不在讨论范围内
这里只要讨论资料库的规划,
资料库本身对这个问题有支援的函数,
以及SQL的过滤条件规则
我想到的是用 MySQL 来做
现在我建立了四张表,分别是 date, staff, weekend, worktype
表名 date staff weekend
栏位 date staff_code staff_name weekend_code weekend_name weight
-------------------------------------------------------------------------------
资料 2010-06-01 000001 staffA 1 日 4
. 000002 staffB 2 一 3
. 000003 staffC 3 二 2
. 000004 staffD 4 三 1
2010-06-30 000005 staffE 5 四 2
000006 staffF 6 五 3
7 六 4
表名 worktype
栏位 worktype_code worktype_name weight
----------------------------------------------
1 A 2
2 B 1
3 C 2
4 D 3
然後依照现实上的需要,有额外的过滤条件
(这部分我想这应该是会用在 where 或 having 的条件):
条件一:每个人都可以特别选择某几天(假设三天)一定要休假(例如连假之类的),
或一定要上某种类的班,不过这个可供设定的栏位
我不知道该设计在哪个表比较好
条件二:假设A是早班,B是正常班,C是午班,D是晚班
不能上完晚班,隔天接着又上早班、正常班或午班,以免太累
也就是说,D的隔天不是休假,就是D
其他三种班可以随便排
条件三:每个人上的各种班别尽量要平均
(例如22天内,ABCD四种班至少都要上到5天,这样是20天,
另外2天可以随便一种班)
条件四:班别或休假希望能尽量排成连续日
条件五:某些星期可以有不同的权重分数,这栏位我在资料表有设计了 weight
例如星期六和日大家一定都不想上班,要和朋友出去玩
为了让大家都能踊跃排星期六日的班,所以六日的权重最高
例如 权重 星期
4 六日
3 五一
2 四二
1 三
好方便主管日後打考评分数
依此类推,worktype 那个表的四种班别也有权重设计
条件六:不能连续上班超过六天(违反劳动基准法?)
条件七:因为6个人,每个人要上班22天,有6x22=132个人/班可以用
但是一个月30天,每天4班,只有120个班可以用
所以势必有132-120=12个人/班,要和别人一起上班
也就是必须有12个班(或以上)是2个人一起上班
条件八:希望至少每个人都能排到1至2天的周末(六日),以尽公平
写了这麽多条件,真的是很复杂
也可以知道这绝对不是作业 = = 应该没人会出这麽困难的作业吧
希望有在研究 排班问题 的高手可以赐教
谢谢~
--
答答的马蹄声
我不是归人,也不是过客,
我.........................................是马......>"<
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.38.243.46