2011-03-03 55 views
0

我有一個表持有時鐘輸入/輸出記錄每個用戶:如何計算LINQ中的總工作時間?

RecID User In/Out ClockInOutTime 
8  1  IN  25/02/2011 09:36:44 
9  1  OUT  25/02/2011 11:36:44 
10 1  IN  25/02/2011 12:36:44 
11 1  OUT  25/02/2011 17:36:44 
12 1  IN  26/02/2011 00:00:00 
13 1  OUT  26/02/2011 12:00:00 
14 1  IN  26/02/2011 09:00:44 
15 1  OUT  26/02/2011 12:36:44 

任何想法如何,我可以工作的總時間工作了使用LINQ每月?

歡呼

+2

首先我試着用TSQL解決它;如果你在TSQL中不能很容易地解決這個問題,那麼它可能不適合LINQ。我敢說,但是每次使用'ClockInTime'和'ClockOutTime'的班次會讓這更容易... – 2011-03-03 11:23:48

回答

1

這在Linq或SQL中是不平凡的。沒有簡單的方法將每條OUT記錄與SQL中相應的IN記錄相關聯。

你有兩個選擇:

  1. 查詢數據和環路內的計算代碼。
  2. 改變模式表所示:RecID, User, ClockInTime, ClockOutTime

選項1是容易實現的,但我會認真考慮的選項2.如何,每個IN記錄必須跟相應的OUT業務規則定義記錄(或是最後的記錄)?

+0

如果他們每天進出幾次,我將如何管理。我無法爲每一個列設置一個列,所以這就是我爲什麼要這樣做的原因,但我知道你的意思:) – scouserider 2011-03-03 11:39:02

+0

@ user583341如果你不想每行調用'shift',就稱之爲'進入時間段' - 它只是定義了一個時鐘輸入時鐘。至少這兩個時間是聯繫在一起的。 – 2011-03-03 11:42:55

+0

@ user583341:您每次進入時,都會創建一條新記錄。每當您退出時,您都會更新最後一條記錄。在創建新記錄之前,您必須檢查ClockOutTime設置爲NULL的記錄。 – 2011-03-03 11:43:29

0
TimeSpan output = new TimeSpan(0,0,0); 
using (var enumerator = input.GetEnumerator()) 
{ 
    while (enumerator.MoveNext()) 
    { 
     var begin = enumerator.Current.ClockInOutTime; 
     if(!enumerator.MoveNext()) 
     break; 

     var end = enumerator.Current.ClockInOutTime; 
     output += (end - begin); 
    } 
} 

是的,它不是LINQ,但我想提供一個解決方案 - 其次,如果日期不會交替(打完一個IN始終是一個OUT),它會打破。

+0

當然,您需要按照DateTime的UserId和Month部分對數據進行分組,將每組有序的輸入/輸出時間傳遞給此函數。 – 2011-03-03 11:29:44

+0

當然 - 我在問題中的例子。儘管如此,獲取數據應該很容易。 – Femaref 2011-03-03 11:30:58

+0

這可能是一個問題 - 如果用戶忘記檢查一天結束它將打破 – scouserider 2011-03-03 11:31:48

0

有沒有解決方案,只會使用linq。這是由於您需要引入錯誤處理(如果用戶忘記註銷,通常會有最大時間將被應用於此等)。

我會按用戶對數據進行分組,按日期時間排序,然後在每個分組中執行一次,然後在每個分組中進行計算。

2
SELECT (SELECT SUM(DATEDIFF(SECOND,[ClockInOutTime], GETDATE())) 
    FROM [swp].[dbo].[Table_1] t1 
    WHERE [In/Out] = 'IN' 
    AND t1.[User] = t.[User]) - 
    Coalesce((SELECT SUM(DATEDIFF(SECOND,[ClockInOutTime], GETDATE())) 
    FROM [swp].[dbo].[Table_1] t2 
    WHERE [In/Out] = 'OUT' 
    AND t2.[User] = t.[User]),0) 
    FROM [swp].[dbo].[Table_1] t 
    GROUP BY [User] 

SQL的方式來解決這個問題,不是最好的,但即使在最後一場比賽沒有OUT戳即當最後一個會話仍未關閉工作。

+0

哇,你是一個勇敢的SQL戰士。第2步:將其轉換爲Linq? :-) – 2011-03-03 12:12:02

+0

您可以使用該代碼在數據庫中創建視圖,並將其與EF進行映射,就像表格一樣。它會更快。 – Silx 2011-03-03 14:34:27