2015-12-19 32 views
0

我有一個訪問數據庫以下列結構如何計算這張桌子上的工作時間?

ID  EmployeeID  DateTime 
1   250    29/11/2015 6:00:00 AM 
2   251    29/11/2015 6:01:25 AM 
3   252    29/11/2015 7:30:05 AM 
4   250    29/11/2015 1:30:45 PM 
5   252    29/11/2015 1:32:20 PM 
6   251    29/11/2015 4:36:41 PM 
7   250    30/11/2015 8:30:50 AM 
8   250    30/11/2015 3:45:22 PM 

該表存儲倍每個員工進入或退出。現在我想進行查詢,以有這樣的數據:

第一個僱員的ID,接下來的兩列進入和退出的時間

EmployeeID  DateTime     DateTime2 
250    29/11/2015 6:00:00 AM  29/11/2015 1:30:45 PM 
251    29/11/2015 6:01:25 AM  29/11/2015 4:36:41 PM 
252    29/11/2015 7:30:05 AM  29/11/2015 1:32:20 PM 
250    30/11/2015 8:30:50 AM  30/11/2015 3:45:22 PM 

請幫我做這個查詢

+0

嘿,4人奉獻出自己的時間來解決你的問題。如果你向我們展示了接受答案或者至少評論那些不是你正在尋找的答案的原因,那將會很好。 – Johanness

回答

0

大概不會最大的一塊SQL,但是這肯定會給你以後有什麼

SELECT e1.EmployeeID, e1.[DateTime] As StartDateTime, e2.[DateTime] As EndDateTime 
    FROM [EmployeeAccess] e1 
    INNER JOIN [EmployeeAccess] e2 ON 
        e1.Employeeid = e2.employeeid 
        and e1.datetime <> e2.datetime 
        and e1.DateTime < e2.datetime 
        and cast(e1.datetime as date) = cast(e2.datetime as date) 

的以下規則一起加入到同一個表:

  1. 賽的僱員
  2. 確保日期時間是不完全一樣的(去除加入同一條目的)
  3. 保證E1日期時間小於E2日期時間(去除加入其中E2高於E1更大)
  4. 確保只有如果每個員工每天只有一個進入和退出的時間匹配同一天條目(確保只參加當天比賽)
0

,你可以只由日化集團這將排序正確以及:

Select 
    EmployeeID, 
    Min([DateTime]) As DateTime1, 
    Max([DateTime]) As DateTime2 
From 
    YourLogTable 
Group By 
    Fix([DateTime]), 
    EmployeeID 
0

如果你每天或輪班多個入口/出口可能會進入第二天(過夜),你可以使用以下命令:

SELECT 
    T1.EmployeeID, 
    T1.DateTime as EntryTime, 
    Min(T2.DateTime) as ExitTime 
FROM TheTable as T1 
    INNER JOIN TheTable as T2 
    ON (T1.EmployeeID = T2.EmployeeID AND T1.DateTime < T2.DateTime) 
GROUP BY T1.DateTime, T1.EmployeeID 
HAVING (count(T2.DateTime) mod2)=1; 

這種長期的工作原理是當你爲每位員工提供每個條目的退出。 如果你不能保證它變得有點厲害,但仍然是可能的:

SELECT 
    T1.EmployeeID, 
    T1.DateTime as EntryTime, 
    Min(T2.DateTime) as ExitTime 
FROM (TheTable as T1 
    INNER JOIN TheTable as T2 
    ON (T1.EmployeeID = T2.EmployeeID AND T1.DateTime < T2.DateTime)) 
    INNER JOIN (
    SELECT EmployeeID, COUNT(DateTime) as EmployeeRecordCount FROM TheTable GROUP BY EmployeeID 
    ) AS T3 ON T1.EmployeeID = T3.EmployeeID 
GROUP BY T1.DateTime, T1.EmployeeID 
HAVING ((count(T2.DateTime) mod 2)<>(FIRST(T3.EmployeeRecordCount) mod 2)); 

這樣做是(爲每一位員工):

  • 加入每條記錄與具有一個最低的時間比自身更大: Min(T2.DateTime) as ExitTimeT1.DateTime < T2.DateTime

  • 然後加入到參賽作品的該員工的總數: INNER JOIN (SELECT EmployeeID, COUNT(DateTime) as EmployeeRecordCount FROM TheTable GROUP BY EmployeeID) AS T3

  • 現在,如果EmployeeRecordCount是偶數,請僅選擇連接表T2的日期時間計數不均勻的行,反之亦然。

(中ocurse HAVING ((count(T1.DateTime) mod 2)=(FIRST(T3.EmployeeRecordCount) mod 2))將給予相同的結果。)