Sql 表中的加班列

Sql 表中的加班列,sql,sql-server,sql-server-2008,tsql,sql-server-2012,Sql,Sql Server,Sql Server 2008,Tsql,Sql Server 2012,办公时间:上午10:00至下午18:00 我编写此查询是为了在员工工作时间超过“8小时”的情况下显示加班时间,例如,如果员工工作时间为“08:44小时”,则加班时间显示为00:44,但现在我不希望出现这种情况 我不想以总的工作时间来计算。我想,如果该人的工作时间超过下午18:00,则应显示加班时间 e、 g.如果员工工作时间为上午10:50至下午18:33,则加班栏应显示00:33。只有当员工工作时间超过下午18:00时,才应计算加班时间 n、 b.事实上,我们的办公室政策是向员工支付加班津贴,

办公时间:上午10:00至下午18:00

我编写此查询是为了在员工工作时间超过“8小时”的情况下显示加班时间,例如,如果员工工作时间为“08:44小时”,则加班时间显示为00:44,但现在我不希望出现这种情况

我不想以总的工作时间来计算。我想,如果该人的工作时间超过下午18:00,则应显示加班时间

e、 g.如果员工工作时间为上午10:50至下午18:33,则加班栏应显示00:33。只有当员工工作时间超过下午18:00时,才应计算加班时间

n、 b.事实上,我们的办公室政策是向员工支付加班津贴,因此他们只计算下午18:00以上的加班时间,即使员工在下午17:00到达办公室并工作到下午18:54,那么他将获得54分钟的加班费,除此之外,他没有工作的时间将导致从工资中扣除,但仍适用于加班津贴

WITH Times AS
(   SELECT  emp.EmplID, 
            emp.EmplName,
            InTime = MIN(atd.RecTime),
            OutTime = MAX(atd.RecTime),
            TimeWorked = DATEDIFF(MINUTE, MIN(atd.RecTime), MAX(atd.RecTime)),
            OverTime = DATEDIFF(MINUTE, MIN(atd.RecTime), MAX(atd.RecTime)) - 480,
            [DateVisited] = atd.RecDate
    FROM    AtdRecord atd 
            INNER JOIN HrEmployee emp 
                ON atd.EmplID = emp.EmplID 
    GROUP BY emp.EmplID, emp.EmplName, atd.RecDate
    HAVING COUNT(atd.RecTime) > 1
)
SELECT  t.EmplID,
        t.EmplName,
        t.InTime,
        t.OutTime,
        t.DateVisited,    
        TimeWorked = CONVERT(CHAR(5), DATEADD(MINUTE, t.TimeWorked, 0), 8),
        OverTime = CASE WHEN t.OverTime < 0 THEN '-' ELSE '' END +
                                CONVERT(CHAR(5), DATEADD(MINUTE, ABS(t.OverTime), 0), 8)
FROM Times t

这就是你想要的逻辑吗

DECLARE @EndTimeA   TIME = '18:00',
        @EndTimeB   TIME = '18:05',
        @EndTimeC   TIME = '19:00',
        @EndTimeD   TIME = '17:55'


SELECT   OvertimeMM_A   =   CASE    WHEN @EndTimeA > '18:00' THEN DATEDIFF(MINUTE, '18:00', @EndTimeA)
                                ELSE 0
                            END
        ,OvertimeMM_B   =   CASE    WHEN @EndTimeB > '18:00' THEN DATEDIFF(MINUTE, '18:00', @EndTimeB)
                                ELSE 0
                            END
        ,OvertimeMM_C   =   CASE    WHEN @EndTimeC > '18:00' THEN DATEDIFF(MINUTE, '18:00', @EndTimeC)
                                ELSE 0
                            END
        ,OvertimeMM_D   =   CASE    WHEN @EndTimeD > '18:00' THEN DATEDIFF(MINUTE, '18:00', @EndTimeD)
                                ELSE 0
                            END
以时间表示


删除了大写字母和粗体字,这并没有增加问题的清晰度,通常被认为是大喊大叫/不好的网络礼仪。看看一个人什么时候进入办公室,那是另一个故事,我想要的是,如果一个人工作时间超过下午18:00,那么这个时间应该显示在加班栏中,否则就不会,你能帮我解释一下所提供的代码是如何无法执行你刚才描述的逻辑的吗?Sok lemme测试了这些,但告诉我wt与这两个查询不同?我必须跑吗?我想你会通过跑这两个项目学到更多,并且了解他们在做什么。因为你要求的逻辑在代码中有描述。
DECLARE @EndTimeA   TIME = '18:00',
        @EndTimeB   TIME = '18:05',
        @EndTimeC   TIME = '19:00',
        @EndTimeD   TIME = '17:55'


SELECT   CONVERT(CHAR(5), DATEADD(MINUTE, OvertimeMM_A, '00:00'), 8)
        ,CONVERT(CHAR(5), DATEADD(MINUTE, OvertimeMM_B, '00:00'), 8)
        ,CONVERT(CHAR(5), DATEADD(MINUTE, OvertimeMM_C, '00:00'), 8)
        ,CONVERT(CHAR(5), DATEADD(MINUTE, OvertimeMM_D, '00:00'), 8)
FROM 
(
    SELECT   OvertimeMM_A   =   CASE    WHEN @EndTimeA > '18:00' THEN DATEDIFF(MINUTE, '18:00', @EndTimeA)
                                    ELSE 0
                                END
            ,OvertimeMM_B   =   CASE    WHEN @EndTimeB > '18:00' THEN DATEDIFF(MINUTE, '18:00', @EndTimeB)
                                    ELSE 0
                                END
            ,OvertimeMM_C   =   CASE    WHEN @EndTimeC > '18:00' THEN DATEDIFF(MINUTE, '18:00', @EndTimeC)
                                    ELSE 0
                                END
            ,OvertimeMM_D   =   CASE    WHEN @EndTimeD > '18:00' THEN DATEDIFF(MINUTE, '18:00', @EndTimeD)
                                    ELSE 0
                                END
)DT