【问题标题】:Showing result for specific person显示特定人员的结果
【发布时间】:2014-01-27 21:40:10
【问题描述】:

我已将此查询写入显示加班如果某人工作时间超过 18:00 pm 时钟时间,无论他/她是什么时间来的或他/她工作的工作持续时间,这超出了主题。它仅在人员工作时间超过 18:00 pm 时才显示 OVERTIME,例如 InTime = 15:16 pm 和 TimeOut= 18:31 然后 Overtime = 00:31。所以我写了下面给出的这个查询,但现在的问题是很少有员工在下午 17:00 离开,他们的加班时间应该在下午 17:00 之后计算(他只在下午 17:00 以上工作了多少分钟+小时),所以那些具体的员工加班时间应该在晚上17:00之后计算

这些员工是:

EmplID 5, 43, 11

所以只有这些加班时间应该在 17:00 之后计算。

查询:

with times as (
SELECT    t1.EmplID
        , t3.EmplName
        , min(t1.RecTime) AS InTime
        , max(t2.RecTime) AS [TimeOut]
        , cast(min(t1.RecTime) as datetime) AS InTimeSub
        , cast(max(t2.RecTime) as datetime) AS TimeOutSub
        , t1.RecDate AS [DateVisited]
FROM  AtdRecord t1 
INNER JOIN 
      AtdRecord t2 
ON    t1.EmplID = t2.EmplID 
AND   t1.RecDate = t2.RecDate
AND   t1.RecTime < t2.RecTime
inner join 
      HrEmployee t3 
ON    t3.EmplID = t1.EmplID 
group by 
          t1.EmplID
        , t3.EmplName
        , t1.RecDate
)
SELECT EmplID
,EmplName
,InTime
,[TimeOut]
,[DateVisited]
,convert(char(5),cast([TimeOutSub] - InTimeSub as time), 108) totaltime
,CONVERT(char(5),CASE WHEN  CAST([TimeOutSub] AS DATETIME) >= '18:00' Then     
 LEFT(CONVERT(varchar(12), DATEADD(ms, DATEDIFF(ms, CAST('18:00' AS DATETIME),   
 CAST([TimeOutSub] AS DATETIME)),0), 108),5) ELSE '00:00' END, 108) AS OVERTIME
FROM times

输出:

【问题讨论】:

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


    【解决方案1】:

    尝试替换:

    CASE WHEN  CAST([TimeOutSub] AS DATETIME) >= '18:00' Then     
     LEFT(CONVERT(varchar(12), DATEADD(ms, DATEDIFF(ms, CAST('18:00' AS DATETIME),   
     CAST([TimeOutSub] AS DATETIME)),0), 108),5) ELSE '00:00' END, 108) AS OVERTIME
    

    CASE WHEN  CAST([TimeOutSub] AS DATETIME) >= '18:00' And EmplId Not In (5,43,11)
         Then  LEFT(CONVERT(varchar(12), DATEADD(ms, DATEDIFF(ms, CAST('18:00' AS DATETIME),  CAST([TimeOutSub] AS DATETIME)),0), 108),5) 
         WHEN  CAST([TimeOutSub] AS DATETIME) >= '17:00' And EmplId In (5,43,11)
         Then  LEFT(CONVERT(varchar(12), DATEADD(ms, DATEDIFF(ms, CAST('17:00' AS DATETIME),  CAST([TimeOutSub] AS DATETIME)),0), 108),5) 
         ELSE '00:00' END, 108) AS OVERTIME
    

    基本上,我只是在WHEN 部分设置了多个条件。 When time &gt; 18:00emplid not IN (5,43,11) 然后是 time &gt; 17:00 and emplid in (5,43,11). 的另一个条件

    这可能更容易理解为伪代码:

    CASE WHEN  TIME >= '18:00' And EmplId Not In (5,43,11)
         Then  -- Calculate overtime at 18:00
         WHEN  TIME >= '17:00' And EmplId In (5,43,11)
         Then  -- Calculate overtime at 17:00
         ELSE '00:00' 
         END OVERTIME
    

    【讨论】:

    • 非常感谢先生,太好了
    猜你喜欢
    • 2023-03-17
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 2015-07-05
    相关资源
    最近更新 更多