SQL語法考勤上下班問題?

1. 看起來原始資料有 'employeeID', 'date' 兩欄, 分別代表'員工號'及'打卡時間', 另外連結 'NameID' 是'員工姓名'.
2. 公式裏用了 convert(varchar,date,111) , 一般是把 date 當保留字, 不會把變數用 date .
3. 再來原本的 select 為
  1. convert(varchar,date,111)+'  '+datename(weekday,date) as date  

既然用 as , 前後的名稱就最好不要一樣, 才知道是原始資料還是轉換的.
4. 最後看了一下公式, 簡化為
  1. Select date,employeeID,NameID,N'上班',as N'下班'  

就邏輯上感覺有點怪, 如果以比較簡單的表格(employeeID,date)來看, datepart(hour,date)如果是 <12 就會在上班, >=12 就會在下班, 所以出現在上班, 就不會出現在下班, 後來補充的範例並沒有問題.

只是以需求來看, 應該要依這樣的步驟思考:
1. 抓讀卡機資料.
2. (目前看起來要補這一項)把讀卡機資料轉成上班打卡記錄, 以標準朝酒晚舞(畫線), 可能像這樣:
  1. 員工號,日期,12點前的打卡時間,12點後的打卡時間  

這部份應該要搭配 select ... group by 處理
3. 等步驟 2 處理完, 才判斷
a. 12 點前的打卡時間, 是漏打還是遲到.
b. 12 點後的打卡時間, 是漏打還是早退.
c. 當天都沒打, 與出差或請假記錄比對.


補充公式(沒有 MS SQL 可測, 大意寫一下)
  1. select 員工號, convert(varchar,打卡時間,111) as 打卡日, 打卡時間, case (12點前算上午,12點後算下午) as 上下午 into #temp_raw  
  2. select 員工號, 打卡日, min(打卡時間) as 上班打卡 from #temp_raw where 上下午='上午' into #temp_morning  
  3. select 員工號, 打卡日, max(打卡時間) as 下班打卡 from #temp_raw where 上下午='下午' into #temp_afternoon  
  4. select 員工號, 打卡日, 上班打卡, 下班打卡 from #temp_raw join #temp_morning join #temp_afternoon group by 員工號, 打卡日  


還是有很多工作上會實作的東西沒有檢測到, 例如: 有分多班制的公司, 有加班等動作的處理, 如果以基本使用大概是這樣吧. (歡迎各位捐 MS Windows Server + SQL 給我, 可折現更好)

以我用過的邏輯大約是這樣:
1. 員工必須先有排班表, 各班有對應的"起始時間"與"結束時間".
2. 若打卡時間在"有排班(已經排除休假)"的"起始時間"與"結束時間"內, 就是遲到或早退.
再把我的回答的第 3 個步驟: 
  1. 3. 等步驟 2 處理完, 才判斷  
  2. a. 12 點前的打卡時間, 是漏打還是遲到.  
  3. b. 12 點後的打卡時間, 是漏打還是早退.  

改成
  1. 3. 等步驟 2 處理完, 以打卡時間對照當天的出勤時間, 是漏打還是遲到/早退.  


原理就是"上下班認定的基準點", 由題目的"中午 12 點"(很奇怪的點), 更細緻的調整成:
  1. 1. 系統預設每個人的應上班時間.  
  2. 2. 員工排休假或調班.  
  3. 3. 打卡時間記錄, 對應排班或休假, 若無特殊排班或休假, 則對應標準應上班時間.  
  4. 4. 做成差勤記錄.  
  5. 5. 月底後 5 日內確認差勤記錄, 若無誤則轉薪資系統處理.  






原問題:http://ithelp.ithome.com.tw/question/10114881