[SQL ] 如何設計排班表
我先說這不是作業 = = 這是為了讓單位的排班能比較順利而想的
想要用 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
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):