【问题标题】:Get Employee Hours Worked获取员工工作时间
【发布时间】:2014-08-03 03:03:48
【问题描述】:

我有一个表,其中包含一个名为 CHECKTIME 的 DATETIME 列,它表示员工何时打卡/打卡。基本上,我有一个执行该功能的查询,但转换不正确。下面的例子。

CHECKTIME

2014-04-28 07:58:36.000
2014-04-28 12:00:27.000
2014-04-28 13:00:02.000
2014-04-28 16:57:45.000

我的查询结果是 Hour = 7.99,而实际结果是 Hours = 7.59。

我想要 7.59 的结果。

SELECT  USERID
       , convert(varchar(10),CHECKTIME,101) as Date
       , SUM(CASE WHEN CHECKTYPE='I' 
                      THEN -1*(datepart(hh,[CHECKTIME])+datepart(mi,[CHECKTIME])/60.0)
                      ELSE datepart(hh,[CHECKTIME])+datepart(mi,[CHECKTIME])/60.0  END) AS Hours

FROM [CHECKINOUT]
WHERE USERID=1003
GROUP BY USERID, CONVERT(varchar(10),[CHECKTIME],101)

【问题讨论】:

  • 抱歉,我理解起来有点困难。你是说你的结果是十进制小时,你想把它转换成小时和分钟?
  • 不,结果以小时为单位,但十进制部分 0.99 需要转换为分钟......这就是我的想法......
  • 您想添加您正在执行请求的表的结构,并提供一个示例吗?

标签: sql sql-server sql-server-2008


【解决方案1】:

这样表达您的查询:

with data(InTime,OutTIme) as (
    select InTime,OutTIme from (values
         (convert(datetime,'2014-04-28 07:58:36.000',120), convert(datetime,'2014-04-28 12:00:27.000',120))
        ,(convert(datetime,'2014-04-28 13:00:02.000',120), convert(datetime,'2014-04-28 16:57:45.000',120))
    )data(InTime,OutTIme)
)
select  cast(dateadd(n,sum(datediff(n,intime,outtime)),0) as time)
from data
go

产生这个:

07:59:00.0000000

我冒昧地手动预透视数据,以便将注意力集中在如何构建时间转换公式上。

更新:- 修改为包含枢轴,生成相同的值:

with data(CheckTime) as (
    select CheckTime from (values
         (convert(datetime,'2014-04-28 07:58:36.000',120))
        ,(convert(datetime,'2014-04-28 12:00:27.000',120))
        ,(convert(datetime,'2014-04-28 13:00:02.000',120))
        ,(convert(datetime,'2014-04-28 16:57:45.000',120))
    )data(CheckTime)
),
pvt as (
    select
        CheckInOut
       ,[0]   as OutTime
       ,[1]   as InTime  
    from (
        select 
             CheckTime
            ,(ROW_NUMBER() over(order by CheckTime)-1) / 2 as CheckInOut
            ,(ROW_NUMBER() over(order by CheckTime)) % 2 as rn
        from data
    )t
    pivot (max(CheckTime) for rn in ([1], [0])) pvt

)
select  cast(dateadd(n,sum(datediff(n,intime,outtime)),0) as time)
from pvt
go

【讨论】:

  • 问题是他们不是代表签入和签出的两列,只有一个名为 CHECKTIME...对我的原始查询有帮助吗?
【解决方案2】:

您提供了示例查询和示例数据。 但样本数据不完整。请添加 CHECKTYPE 的值,因为这将使我们更容易提供解决方案。 同时它避免了彼得必须做的任何不必要的工作/猜测。 最后,像“它不起作用”这样的回复等于没有回复,因为它不会让我们更进一步......

【讨论】:

    【解决方案3】:

    首先,让我们做一些测试数据:(我冒昧地添加了一个 emp id 列,这样我就可以添加多个员工时间。

    DECLARE @CheckDate TABLE
    (
        EmpId INT,
        CheckTime DATETIME
    )
    
    INSERT INTO @CheckDate
    ( EmpId, CheckTime ) 
    VALUES
    (1, '2014-04-28 07:58:36.000'),
    (1, '2014-04-28 12:00:27.000'),
    (1, '2014-04-28 13:00:02.000'),
    (1, '2014-04-28 16:57:45.000'),
    (2, '2014-04-27 1:00:02.000'),
    (2, '2014-04-27 16:57:45.000');
    

    现在我们创建一个 CTE 来查找下一行,这样我们就可以获得打卡和打卡的开始和结束。

    ;WITH CheckRows AS
    (
        SELECT *,
            ROW_NUMBER() OVER (PARTITION BY EmpId ORDER BY CheckTime) RN
        FROM @CheckDate p
    ),
    CheckBreaks AS
    (
        SELECT 
            p.EmpId, 
            p.CheckTime, 
            p.RN, 
            ISNULL(n.CheckTime, 0) NextTime
        FROM CheckRows p
        INNER JOIN CheckRows n
            ON n.RN = p.RN + 1
            AND n.EmpId = p.EmpId
    )
    

    现在我们查询数据以查找基于打卡的工作分钟数(RN 1 作为第一个打卡/打卡,RN 3 作为第二个打卡/打卡,如果您允许更多,只需为每个打卡添加接下来的几个奇数组)

    SELECT 
        c.EmpId,
        SUM(CASE WHEN c.RN = 1 OR c.RN = 3 THEN DATEDIFF(MINUTE, c.CheckTime, c.NextTime) ELSE 0 END) DiffTime,
        SUM(CASE WHEN c.RN = 1 OR c.RN = 3 THEN DATEDIFF(MINUTE, c.CheckTime, c.NextTime) ELSE 0 END) / 60 DiffHour,
        SUM(CASE WHEN c.RN = 1 OR c.RN = 3 THEN DATEDIFF(MINUTE, c.CheckTime, c.NextTime) ELSE 0 END) % 60 DiffMinute
    FROM CheckBreaks c
    GROUP BY c.EmpId
    

    这是工作小时/分钟的输出:

    EmpId   DiffTime    DiffHour    DiffMinute
    1   479 7   59
    2   957 15  57
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-14
      • 2022-11-01
      相关资源
      最近更新 更多