Sql 用于计算在办公室花费的时间的查询

Sql 用于计算在办公室花费的时间的查询,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个列为的表格:姓氏、进入办公室的日期和时间、离开办公室的日期和时间 我必须写一个查询,返回雇主每周在办公室花费的小时数 我不知道怎么做,请帮忙。测试数据 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

我有一个列为的表格:姓氏、进入办公室的日期和时间、离开办公室的日期和时间

我必须写一个查询,返回雇主每周在办公室花费的小时数


我不知道怎么做,请帮忙。

测试数据

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 ║
╚═══════╩════════════╩════════════╩══════════════╝

测试数据

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 ║
╚═══════╩════════════╩════════════╩══════════════╝

查找
DATEPART
DATEDIFF
以获取周数使用此选择日期部分(wk,@Dt),然后使用周数创建查询并进行聚合。对于小时数,可以进行求和(datediff等。在完成之前,请确保您知道如何处理部分时间。对于一周的开始和结束部分,日历表非常方便。它使您能够指定一周是从星期日开始还是从星期一开始,或者是您的业务指定的任何时间。是否有可能进入和退出属于两个不同的时间段ent weeks?@McNets,这不可能简化任务查找
DATEPART
DATEDIFF
以获取周数。使用此选择日期部分(wk,@Dt),然后使用周数创建查询并进行聚合。对于小时数,可以进行求和(datediff等。在完成之前,请确保您知道如何处理部分时间。对于一周的开始和结束部分,日历表非常方便。它使您能够指定一周是从星期日开始还是从星期一开始,或者是您的业务指定的任何时间。是否有可能进入和退出属于两个不同的时间段前几周?@McNets,这不可能简化任务。你救了我,非常感谢。我祝你一切顺利。你救了我,非常感谢。我祝你一切顺利