[SQL ] 如何設計排班表

看板Database作者 (冰燄聖龍)時間15年前 (2010/05/28 21:05), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/2 (看更多)
我先說這不是作業 = = 這是為了讓單位的排班能比較順利而想的 想要用 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
文章代碼(AID): #1B_x-i4K (Database)
文章代碼(AID): #1B_x-i4K (Database)