2017-01-22 66 views
1

花了我有表列:名字,日期和进入退出的办公室,日期和时间的时间查询计算时间在办公室

enter image description here

我写的查询,返回数量小时是雇主花了每周的办公室,例如

enter image description here

我不知道该怎么做,请帮助。

+1

查找了'DATEPART'&'DATEDIFF' –

+0

要获取周数,请使用此SELECT DATEPART(周,@Dt) 然后使用周数创建查询并进行聚合。 – Habeeb

+0

对于几个小时,你可以做sum(datediff等)在完成之前,确保你知道如何处理部分时间。对于开始和结束部分的一周,日历表就派上用场了。这使您能够指定星期是星期日还是星期一开始,还是指定星期,或者您的业务指定的任何星期。 –

回答

0

测试数据

Declare @T TABLE (EmpID INT , Enter DATETIME , [Exit] DATETIME) 

INSERT INTO @T VALUES 
(1 , '2017-01-22 09:26:00.000' , '2017-01-22 15:25:00.000') 
,(1 , '2017-01-21 10:15:00.000' , '2017-01-21 12:00:00.000') 
,(1 , '2017-01-20 09:05:00.000' , '2017-01-20 13:05:00.000') 
,(1 , '2017-01-21 10:15:00.000' , '2017-01-21 12:00:00.000') 
,(2 , '2017-01-22 09:26:00.000' , '2017-01-22 15:26:00.000') 
,(2 , '2017-01-21 10:15:00.000' , '2017-01-21 12:30:00.000') 
,(2 , '2017-01-20 09:05:00.000' , '2017-01-20 13:05:00.000') 

查询

Select EmpID 
    , CONVERT(VARCHAR(10) ,DATEADD(DAY, - (DATEPART(WEEKDAY, Enter)-1), Enter) , 104) [WeekStart] 
    , CONVERT(VARCHAR(10) ,DATEADD(DAY, 7- (DATEPART(WEEKDAY, Enter)), Enter) , 104) [WeekEnd] 
    , CAST(SUM(DATEDIFF(minute,Enter, [Exit]))/60.00 AS DECIMAL(10,2)) [Hours Worked] 

FROM @T 
GROUP BY EmpID 
    , CONVERT(VARCHAR(10) ,DATEADD(DAY, - (DATEPART(WEEKDAY, Enter)-1), Enter) , 104) 
    , CONVERT(VARCHAR(10) ,DATEADD(DAY, 7- (DATEPART(WEEKDAY, Enter)), Enter) , 104) 

结果集

╔═══════╦════════════╦════════════╦══════════════╗ 
║ EmpID ║ WeekStart ║ WeekEnd ║ Hours Worked ║ 
╠═══════╬════════════╬════════════╬══════════════╣ 
║  1 ║ 15.01.2017 ║ 21.01.2017 ║   7.50 ║ 
║  1 ║ 22.01.2017 ║ 28.01.2017 ║   5.98 ║ 
║  2 ║ 15.01.2017 ║ 21.01.2017 ║   6.25 ║ 
║  2 ║ 22.01.2017 ║ 28.01.2017 ║   6.00 ║ 
╚═══════╩════════════╩════════════╩══════════════╝ 
+0

您救了我,非常感谢。 – rebrikk