当前位置: 首页 > 知识库问答 >
问题:

SQL:计算员工每天的使用时间

元嘉木
2023-03-14

SQL:我有一个在StartTime和EndTime列中包含员工工作时间的表。我想计算每个员工每天的工作时间,即使员工在一天开始轮班,第二天结束。

|Employee |StartTime         |EndTime         |
|A        | 01/01/2001 23:00 |02/01/2001 10:00|
|B        | 01/01/2001 21:00 |01/01/2001 22:00|

Output:
|Employee |Date         |HoursWorked              
|A        | 01/01/2001  | 1         |
|A        | 02/01/2001  | 10        |
|B        | 01/01/2001  | 1         |

共有3个答案

胡利
2023-03-14

您可以尝试以下查询-

create table #Employee (
     Employee varchar(10), StartTime smalldatetime      , EndTime smalldatetime
)
go

insert into #Employee   
select 'A'     , ' 01/01/2001 23:00', '02/01/2001 10:00' 
union all select 'B '     , '01/01/2001 21:00', '01/01/2001 22:00'   

select Employee ,  cast(StartTime as date) [Date] ,  datediff(hour,StartTime, EndTime)HoursWorked              
from #Employee 
where cast(StartTime as date) = cast(EndTime as date )
union all 
select Employee ,  cast(StartTime as date) [Date] ,    datediff(hour,StartTime, cast( concat(cast(StartTime as date) ,' 23:59:59' )as smalldatetime))  HoursWorked                  
from #Employee 
where cast(StartTime as date) <> cast(EndTime as date ) 
union all 
select Employee ,  cast(EndTime as date) [Date] ,    datediff(hour, cast( concat(cast(EndTime as date) ,' 00:00:00' )as smalldatetime) ,EndTime) HoursWorked                  
from #Employee 
where cast(StartTime as date) <> cast(EndTime as date ) 
孔建柏
2023-03-14

使用DATEDIFF函数

create table #employee (Employee varchar(10), StartTime datetime, EndTime datetime)
insert into #employee values ('A','2001-01-01 23:00', '2001-01-02 10:00')

select Employee, CAST(StartTime as DATE) [Date], DATEDIFF(HOUR,StartTime, EndTime)HoursWorked from #employee
齐胜涝
2023-03-14

这里是一种使用递归CTE的方法:

DECLARE @t TABLE(
Employee NVARCHAR(10)
,StartTime DATETIME
,EndTime DATETIME
)

INSERT INTO @t VALUES ('A', '2001-01-01 23:00:00', '2001-01-03 10:00:00')
                     ,('A', '2001-01-05 21:00:00', '2001-01-06 22:00:00')
                     ,('A', '2001-01-07 21:00:00', '2001-01-08 22:00:00')
                     ,('B', '2001-01-01 21:00:00', '2001-01-01 22:00:00')
                     ,('B', '2001-01-02 21:00:00', '2001-01-03 02:00:00')
                     ,('C', '2001-01-03 02:00:00', '2001-01-04 00:00:00');

WITH cte AS(
  SELECT 1 AS lvl, Employee, CONVERT(DATE, StartTime) StartTime_DATE, StartTime, EndTime
    FROM @t AS t
  UNION ALL
  SELECT lvl + 1 AS lvl, c.employee, DATEADD(d, 1, c.StartTime_DATE) StartTime_DATE, c.StartTime, c.EndTime
    FROM cte AS c
    WHERE DATEADD(d, 1, c.StartTime_DATE) < c.EndTime
),
cteCalc AS(
  SELECT *
        ,CONVERT(DATE, StartTime) AS StartDate
        ,CASE WHEN lvl > 1 THEN CONVERT(DATETIME,CONVERT(DATE, DATEADD(d, DATEDIFF(d, StartTime, StartTime_DATE), StartTime))) ELSE DATEADD(d, DATEDIFF(d, StartTime, StartTime_DATE), StartTime) END AS StartTimeNew
        ,ISNULL(CONVERT(datetime, LEAD(StartTime_DATE) OVER (PARTITION BY Employee, CONVERT(DATE, StartTime) ORDER BY StartTime_DATE)), EndTime) AS EndTimeNew
    FROM cte

)
SELECT Employee, StartTime_DATE AS StartDate, DATEDIFF(MINUTE, StartTimeNew, EndTimeNew)/60.0 AS WorkHours
  FROM cteCalc
  ORDER BY Employee, StartTime_DATE
  OPTION (MAXRECURSION 0)
 类似资料:
  • 问题内容: 我的表格“订单”中有50行/条目。我有一列名为的列,该列用于保存在处的订单声明。 此字段中的日期格式如下:2011-10-03 07:07:33 格式为(yy / mm / dd time)。 我也有一个专栏,这是他们支付的金额。 我想显示每天的总数。 因此,对于2011年10月3日之后的6个订单,应采用6个订单的值,并将它们加在一起。 所以我可以显示: 我怎样才能做到这一点? 问题答

  • 问题内容: 我有一个sql代码,可以获取每个员工的总工作时间及其超时时间。我想计算他当天的总加班时间。你能帮我吗?8小时是每天的常规时间。 这是代码 样品输出 我想要的是这样的 问题答案: 你可以做这样的事情 这是 SQLFiddle 演示 您需要为提供真正的默认值,并针对当他们。在一个极端的情况下,如果s是由员工有一天到另一天回家而造成的,那么这些默认值可能分别是和,因为您要计算每个日历日的加班

  • 我有一个名为-'users'的示例sql表,其中包含以下记录: 我想获得每一个用户的计数在每日,每周和每月的基础上与预期的outlike为:

  • 我有以下数据帧(示例): 我想创建一个名为“斜率”的列,它显示每组每n(n=3)天的斜率。这意味着当第一个日期是“2022-09-01”和3天后用于计算时。斜率可以使用“diff_days”(通过与每组第一个值的差异计算)和“值”列来计算。以下是所需的输出: 以下是一些示例计算,可为您提供一个想法: A组前3天:斜率([0,1,3],[2,1,3])=0.43 A组3天后:斜率([5,6,6],[

  • 公共静态员工getEmployeeDetails()--它获取员工的详细信息-id、姓名和工资,并返回Employee对象。 public static int getpfpercentry()-它获取PF百分比并返回相同的 在main方法中调用上述两个方法,然后调用Employee类中的calculateNetSalary方法并打印输出,如下所示。 输入ID:101输入姓名:Vivek输入工资:

  • 我想要工资的百分比栏为(工资/总工资)*100。 我试过这个,但它总是给0。 我甚至不会应用乘法运算。查询给出了应用乘以100时的错误。