勞動部在105年12月通過一例一休之後,開始了國內各公司HR與MIS不眠不休的制度與系統調整。以勞基法的規定,滿週年後才給假,且給假天數都是整數,所以不會有依比例的問題。但由於之前公司是採用曆年制,為配合勞基法未來修法方向,明年也將調整為週年制,在制度轉換的過渡期則是以105/12/31計算員工在公司的整數年年資,以勞基法新級距所對照出來的休假天數,再依到職週年日佔全年日期的比例計算。不過,公司的給假的規定是一天8小時,休假最小單位是0.5小時,所以計算出來的休假時數還要再判斷:未滿0.5小時以0.5小時計,超過0.5小時未滿1小時以1小時計。<br /> <br /> 今天要來牽拖的就是這最後一個規則:<strong>未滿0.5小時以0.5小時計,超過0.5小時未滿1小時以1小時計</strong>。<br /> <br /> <!--more--><br /> <br /> 如下圖。<br /> <br /> <img class="alignnone size-full wp-image-287" src="http://blog.gss.com.tw/wp-content/uploads/2016/12/leavehours.png" alt="leavehours" width="206" height="180" /><br /> <br /> 直覺的想法是將計算出來的原始時數(OriginalHours)拆成整數X和小數Y<br /> <br /> <img class="alignnone size-full wp-image-289" src="http://blog.gss.com.tw/wp-content/uploads/2016/12/leavehours_code.png" alt="leavehours_code" width="264" height="210" /><br /> <br /> 不過這樣看起來有點麻煩(循環複雜度至少3),是否有比較簡單的作法可以不用這麼多判斷?<br /> 其實,換個角度想,如果我們把每天8小時以0.5小時為單位,總共可以切成16個單位,接下來就是只要是落在單位與單位之間的時數無條件進位到下一個單位。<br /> 所以原來的寫法可以改成:<strong>無條件進位(OriginalHours*2)/2</strong>也就是先把計算出來的時數*2之後無條件進位到整數,再除以2。<br /> 拆成3個步驟來解釋<br /> 1. OriginalHours*2 因為每0.5小時為一個單位,所以先乘以2。<br /> 2. 將上述的結果採無條件進位到整數。<br /> 3. 將上一步驟的結果再除以2,<strong>由於上一步驟已進位到整數,所以除以2之後只會得到0或0.5的結果</strong>。<br /> <br /> 這兩種作法有什麼差別?就交給大家去體會了~<br /> <br /> PS:在Excel中可以用Roundup(OriginalHours,0),在SQL中可以用 Ceiling(OriginalHours)