2012-02-11 31 views
0

我有三個表如何總結類似員工的時間值在SQL Server 2008中

  • 員工EmployeeID, EmployeeName
  • EmployeeTimeInEID, Time_In, Date_Ref, State_Flag, HoursConsumed
  • EmployeeTimeOutEID, Time_Out, Date_Ref, State_Flag

我附上了包含樣本數據的這些表格的圖像。

我需要編寫一個查詢,列出所有員工的ID,姓名和他們消費的總時間。爲此我需要總結每位員工的時間價值。我寫此查詢,其中列出它們在timein和超時表中列出的所有員工:

select e.EmployeeID, e.EmployeeName, e1.HoursConsumed 
from EmployeeTimeIn as e1, Employee as e 
where e1.EID = e.EmployeeID; 

我想要做這樣的事情:

select e.EmployeeID, e.EmployeeName, SUM(e1.HoursConsumed) 
from EmployeeTimeIn as e1, Employee as e 
where e1.EID = e.EmployeeID; 

HoursConsumed是一個時間字段。有任何想法嗎?

Employee Tables

+0

如果添加「GROUP BY e.EmployeeID,e.EmployeeName'不起作用? – SQLMenace 2012-02-11 17:30:00

+0

它顯示此錯誤: 除非使用IS NULL或LIKE運算符,否則不能比較或排序文本,ntext和圖像數據類型。 – Azeem 2012-02-11 17:36:51

+0

您是否將EmployeeName定義爲文本或ntext? – 2012-02-11 17:51:48

回答

0

現在,你有你的分組字段爲varchar()或類似的類型,你可以做這樣的事情......

select e.EmployeeID, e.EmployeeName, SUM(DATEDIFF(ns, 0, e1.HoursConsumed)) 
from EmployeeTimeIn as e1, Employee as e 
where e1.EID = e.EmployeeID; 
group by e.EmployeeID, e.EmployeeName 

根據的準確性你總結什麼,你可能會使用不同的時間單位。 TIME精確到100ns(默認情況下,最好),所以使用ns可以保持絕對的準確性,但在大量數據時更容易溢出:)

如果您需要將其轉換回一次,可以使用類似的東西:

DATEADD(ns, SUM(DATEDIFF(ns, 0, e1.HoursConsumed)), 0) 
+0

這會引發溢出錯誤: 消息535,級別16,狀態0,行4 datediff函數導致溢出。分隔兩個日期/時間實例的日期部分數量太大。嘗試使用不精確的日期部分的datediff。 – Azeem 2012-02-11 18:52:55

+0

使用'NS',您可以計算最多相隔兩秒鐘的時間戳之間的差異! 'MS'可能就夠了,從OP的例子來看,它甚至可能是'S'。 – 2012-02-11 19:34:20

+0

經過深入研究後,我發現爲了解決這個問題,我需要編寫非常複雜的t-SQL腳本。所以我改變了HoursConsumed的數據類型爲整數,現在我可以使用SUM函數。 感謝您的快速回復。 – Azeem 2012-02-12 08:06:46