2014-01-27 2 views
1

Время работы офиса: 10:00 am to 18:00. Офисная политика: На самом деле, наша офисная политика заключается в том, чтобы выплачивать сотрудникам стипендию за сверхурочную работу, поэтому они рассчитывают сверхурочную работу только выше 18:00 pm часов, даже если человек прибывает в офис по телефону 17:00 pm и работал до 18:54 pm, даже тогда ему будет выплачено 54mins overtime, кроме того, что он не работал, это приведет к вычету из заработной платы, но все же будет применяться для выплаты стипендии сверхурочным.Расчет времени в соответствии с конкретным временем

Вопрос: Я написал этот запрос, чтобы рассчитать общее время работы человека в день, продолжительность его работы, я имею в виду. Теперь я пытаюсь вычислить новый столбец OVERTIME, который должен показывать продолжительность сверхурочной работы, которую совершил человек, если и только если человек работал выше, чем 18:00 pm, то время должно подпадать под овертаймовую колонку другим способом 00:00, так что помогите мне в этом

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)), 

       [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) 

    FROM Times t 

Выход:

Image

Выход раствора Вигнеш Кумар:

enter image description here

ответ

1

Попробуйте вместо этого:

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 

Source

+1

Я добавил здесь новое решение. Попробуйте этот –

+0

Это хороший, но он показывает сверхурочную работу, даже если человек работал с 9:00 до 17:15, но нет, я хочу если и только если человек работал выше 18:00 вечера, чем показало сверхурочное время, например 13:15 до 18:20, затем OVERTIME = 20mins –

+0

Можете ли вы разместить образцы данных и в sqlfiddle –

1

Я думаю, что вы могли бы просто сделать DATEDIFF (MINUTE, OutTime, '18: 00 '). Если результат положительный, то у них есть сверхурочная работа. Если нет, то просто возвращает 0. Это может быть сделано в сазе:

SELECT 
    CASE 
    WHEN DATEDIFF(MINUTE, OutTime, '18:00') > 0 THEN DATEDIFF(MINUTE, OutTime, '18:00') 
    ELSE 0 
    END AS 'Overtime' 

(Вы, возможно, потребуется поставить «18:00:00», чтобы получить SQL Server, чтобы увидеть его как часы вместо минут .)

+0

я хочу, если человек работает с 9:00 до 17:15, но нет, я хочу, тогда и только тогда, когда человек работал над 18 : 00:00, чем следует показывать сверхурочную работу, например 13:15 до 18:20, затем OVERTIME = 20mins –

Смежные вопросы