Как рассчитать продолжительность сверхурочной работы в соответствии с InOutMode с помощью sql ?
Я пытаюсь рассчитать продолжительность сверхурочной работы для каждого сотрудника.
Я использую таблицу журналов: Log_Attendance:
EnrollNumber DateAttendance TimesInOut ModeEvent 1 12-07-2015 12-07-2015 14:00:00 4 1 12-07-2015 12-07-2015 15:00:00 5 1 12-07-2015 12-07-2015 17:00:00 4 1 12-07-2015 12-07-2015 18:00:00 4 1 12-07-2015 12-07-2015 19:00:00 5
ModeEvent= 4 --> OverTimeOut
ModeEvent= 5 --> OverTimeIn
Мне нужно, чтобы система давала NULL, когда у сотрудника есть последовательные строки с одним и тем же ModeEvent (пример строки 3: у сотрудника есть overtimeIN, но он не отметил свой OvertimeOut)
Я попробовал этот запрос, но он дает мне неправильные значения:
SELECT EnrollNumber, TimesInOut, NextDate, Mode, DATEDIFF(Minute, TimesInOut, NextDate) as duration FROM ( SELECT EnrollNumber, ID, TimesInOut, Mode, DateAttendance, ( SELECT MIN(TimesInOut) FROM Log_Attendance T2 WHERE T2.EnrollNumber = T1.EnrollNumber AND T2.TimesInOut > T1.TimesInOut and T2.Mode <> T1.Mode ) AS NextDate FROM Log_Attendance T1 where mode in (4) ) AS T where mode in (4,5) and EnrollNumber=1
Пожалуйста, есть какое-нибудь решение ?
Michael_Davies
Глядя на ваш пример, предположим, что 4=In, а не Out и 5=Out, а не in...
Почему бы не подумать о том, чтобы держать вход и выход в двух отдельных полях таблицы, это значительно упростило бы выполнение вычислений и определение отсутствующих выходов. По умолчанию время выхода должно быть полночь на раннюю дату, например 01/01/1980, чтобы обозначить, что он не был подписан. Тогда все, что вам нужно,-это WHERE out<>01/01/1980, чтобы поймать все подписанные сверхурочные и изменить его на=, чтобы поймать неподписанные...
Leila Toumi
Я не могу, потому что у меня есть другой режим событий, такой как CheckIn, CheckOut, BreakIn и breakOut
Leila Toumi
спасибо за ваш ответ, но не могли бы вы привести мне пример, пожалуйста.
Michael_Davies
Я обновил свой комментарий.
У вас есть два столбца в таблице, один для тайм-аута и один для тайм-аута, установите по умолчанию тайм-аут, чтобы быть известной ранней датой, как я предлагаю.
Затем вы можете выбрать с помощью DATEDIFF эти два поля без каких-либо сложных суб-выделений.
Это также помогает при проверке выхода из системы, например, я предполагаю, что кто-то не должен быть в состоянии выйти на следующий день сверхурочный вход с предыдущего дня или любое другое правило, которое вы хотите применить в отношении сверхурочных часов. Если вы делаете это так, как у вас есть, то все ваши обновления и выбор будут сложными.