2014-04-26 18 views
0

我正在構建一個考勤模塊。SQL如何識別第一次和最後一次從一天的時間戳記錄

該過程從導入Timesheet員工文件開始。

時間表員工文件有以下欄目(來自同一名員工紅圈顯示的時間記錄)

enter image description here

傳感器列,讓我們知道,如果是的入口傳感器(ENT)或退出傳感器(EXT

該信息被加載到臨時表中我的SQL數據庫。我的員工表有一個RFID_Card列,所以我可以在時間表中匹配導入的數據。

然後,我必須運行一個存儲過程,我可以在每個時間記錄插入到我的「employee_timerecord」表中。該表是這樣的:

enter image description here

  • 僱員(KEY):僱員ID(從員工表)
  • 時間戳(KEY):時間戳記錄(日期時間)從我進口數據
  • SensorType(BOOL):0 =入口,1 = EXIT
  • TimeStamp_Type(TINYINT):1 =第一天入口,2 =最後一天入口,3 =間工作時間,4 = ....等

我的存儲過程SQL腳本應該是這個樣子:

INSERT INTO employee_timerecord (employeeid, timestamp,sensortype,timestamp_type) 

     SELECT 
     em.employeeid, 
     tsi.timestamp, 
     s.sensortype, -- 0 = Entrance, 1 = Exit 

     --HERE I HAVE TO CHECK IF THE TIME RECORD FOR THAT EMPLOYEE 
    --IS THE FIRST ENTRANCE IN THE DAY THEN ASSING A 1, IF ITS THE LAST 
    --EXIT IN THE DAY THEN ASSIGN A 2, etc 

     FROM timesheet_import_temp tsi 
     JOIN sensor s ON s.sensorcode = tsi.sensorcode 
     JOIN employee em ON em.rfidcard = tsi.rfidcard 
從上面的示例表

所以,我應該得到的是:

Employee with RFID 76:23146: the first timestamp in the day was at: 01/04/2014 06:57:40 a. m. 

Employee with RFID 76:23146: the last timestamp in the day was at: 01/04/2014 15:04:48 p. m. 

任何線索?

+0

做員工通宵工作,或者你可以假設員工將進入並在同一天離開? – attila

+0

有一些員工(取決於他們的班次)很快就會在一夜之間工作。 :)似乎你真的瞭解時間和出勤。謝謝 – VAAA

+0

@VAAA我的建議是否適合你?它應該如果你不處理過夜班次。 – plalx

回答

1

你的意思是這樣的?在這裏,我們選擇條目之間的最大時間段,使我們能夠將它們分組(塊)。這意味着我們不再考慮了,而是根據輪班。因此,這顯示瞭如何獲得輪班的第一個輸入。請注意,它不會阻止您知道輪班在哪一天開始。

注:該代碼是沒有測試

-- Helps creating entries blocks 
DECLARE @maxHoursBetweenEntries int = 4; 

CASE 
    WHEN (
     SELECT MIN(timestamp) 
     FROM timesheet_import_temp tsi1 
     WHERE 
      rfidcard = tsi.rfidcard 
      AND sensortype = 0 
      AND ISNULL(DATEDIFF(
       hour, 
       (
        SELECT MAX(timestamp) 
        FROM timesheet_import_temp 
        WHERE 
         AND rficard = tsi1.rficard 
         AND timestamp < tsi1.timestamp 
         AND sensortype = 1 
      ), 
       timestamp 
      ), maxHoursBetweenEntries) >= @maxHoursBetweenEntries 
    ) = tsi.timestamp THEN 1 
    ... 
END 
+0

最大經過時間計算可以在同一個CASE中完成? – VAAA

+0

@VAAA我相應地修改了答案。這是你的意思嗎?我沒有測試,但它應該給你的想法。 – plalx

+0

Ohh聽起來不錯,是最快的時間之間的條目將是8個小時,因爲只有3個班次...我會稍後嘗試代碼,並讓你知道。我非常感謝@plalx – VAAA

0

我做了一個非常類似的事情。

您需要爲數據中的第3行和第4行創建第一個或最後一個計數的假設。

我現在正在爲你製作一個sql小提琴。

T-SQL join to get both mated and non mated start and stop records

+0

非常感謝你的幫助。這個時間和出勤的東西和規則似乎不太容易,而且我有一個2個月的死亡時間讓這個模塊啓動並運行:( – VAAA

+0

好的!我看你只需要第一個和最後一個。是嗎? –

+0

是的,以後我會將不得不處理隔夜班,這肯定會是一個痛苦的脖子 – VAAA

相關問題