2. 公式裏用了 convert(varchar,date,111) , 一般是把 date 當保留字, 不會把變數用 date .
3. 再來原本的 select 為
- convert(varchar,date,111)+' '+datename(weekday,date) as date
既然用 as , 前後的名稱就最好不要一樣, 才知道是原始資料還是轉換的.
4. 最後看了一下公式, 簡化為
- Select date,employeeID,NameID,N'上班',as N'下班'
就邏輯上感覺有點怪, 如果以比較簡單的表格(employeeID,date)來看, datepart(hour,date)如果是 <12 就會在上班, >=12 就會在下班, 所以出現在上班, 就不會出現在下班, 後來補充的範例並沒有問題.
只是以需求來看, 應該要依這樣的步驟思考:
1. 抓讀卡機資料.
2. (目前看起來要補這一項)把讀卡機資料轉成上班打卡記錄, 以標準朝酒晚舞(畫線), 可能像這樣:
- 員工號,日期,12點前的打卡時間,12點後的打卡時間
這部份應該要搭配 select ... group by 處理
3. 等步驟 2 處理完, 才判斷
a. 12 點前的打卡時間, 是漏打還是遲到.
b. 12 點後的打卡時間, 是漏打還是早退.
c. 當天都沒打, 與出差或請假記錄比對.
補充公式(沒有 MS SQL 可測, 大意寫一下)
- select 員工號, convert(varchar,打卡時間,111) as 打卡日, 打卡時間, case (12點前算上午,12點後算下午) as 上下午 into #temp_raw
- select 員工號, 打卡日, min(打卡時間) as 上班打卡 from #temp_raw where 上下午='上午' into #temp_morning
- select 員工號, 打卡日, max(打卡時間) as 下班打卡 from #temp_raw where 上下午='下午' into #temp_afternoon
- select 員工號, 打卡日, 上班打卡, 下班打卡 from #temp_raw join #temp_morning join #temp_afternoon group by 員工號, 打卡日
還是有很多工作上會實作的東西沒有檢測到, 例如: 有分多班制的公司, 有加班等動作的處理, 如果以基本使用大概是這樣吧. (歡迎各位捐 MS Windows Server + SQL 給我, 可折現更好)
以我用過的邏輯大約是這樣:
1. 員工必須先有排班表, 各班有對應的"起始時間"與"結束時間".
2. 若打卡時間在"有排班(已經排除休假)"的"起始時間"與"結束時間"內, 就是遲到或早退.
再把我的回答的第 3 個步驟:
- 3. 等步驟 2 處理完, 才判斷
- a. 12 點前的打卡時間, 是漏打還是遲到.
- b. 12 點後的打卡時間, 是漏打還是早退.
改成
- 3. 等步驟 2 處理完, 以打卡時間對照當天的出勤時間, 是漏打還是遲到/早退.
原理就是"上下班認定的基準點", 由題目的"中午 12 點"(很奇怪的點), 更細緻的調整成:
- 1. 系統預設每個人的應上班時間.
- 2. 員工排休假或調班.
- 3. 打卡時間記錄, 對應排班或休假, 若無特殊排班或休假, 則對應標準應上班時間.
- 4. 做成差勤記錄.
- 5. 月底後 5 日內確認差勤記錄, 若無誤則轉薪資系統處理.
原問題:http://ithelp.ithome.com.tw/question/10114881