Member 13165845 Ответов: 1

Я хочу сделать переход вращения в результате


Я хочу сделать переход вращения в результате
Всем Привет,


Нужна помощь для нижеследующего.


Я хочу получить вращательный сдвиг в результате.


Моя таблица выглядит следующим образом :


MachinePunchingData
sEnrollNumber iDateTime
3 2018-04-03 07:11:10.000
3 2018-04-03 23:11:19.000
3 2018-04-03 23:40:29.000
3 2018-04-04 00:11:32.000
3 2018-04-04 01:11:34.000
3 2018-04-04 05:12:09.000
3 2018-04-04 07:10:26.000
3 2018-04-04 23:04:28.000


ShiftMaster
ShiftID ShiftStartTime ShiftEndTime IsRotational Общее Время Работы
1 23:00:00 07:00:00 08:00:00 правда


Эмпмастер
Empid в PunchID(sEnrollNumber) Имени Л. Неймане Метод Isactive ShiftID
1 3 Xyz Xyz true 1
Я хочу ниже привести:
sEnrollNumber iDateTime In/Out AttnDate
3 2018-04-03 07:11:10.000 Out 2018-04-02
3 2018-04-03 23:11:19.000 в 2018-04-03
3 2018-04-03 23:40:29.000 Out 2018-04-03
3 2018-04-04 00:11:32.000 в 2018-04-03
3 2018-04-04 01:11:34.000 Out 2018-04-03
3 2018-04-04 05:12:09.000 в 2018-04-03
3 2018-04-04 07:10:26.000 Out 2018-04-03
3 2018-04-04 23:04:28.000 в 2018-04-04


Проблемы :

Как я буду определять, какой из них для входа, а какой для выхода.
Emplolyee может прийти раньше, чем его смена, например, в 22:00:00
А может быть, поедем в 06:00:00
Сотрудник может прийти поздно : 00:11:01
Идти поздно : 08:11:23
Прошу вас всех, если у вас есть какая-либо идея или решение для этого, то помогите мне.


Спасибо,
Чинтан

Что я уже пробовал:

выбирать
Функции row_number() над(раздел по [sEnrollNumber] приказ [iDateTime] АСК) [PunchNum],sEnrollNumber,
iDatetime,
Литой(iDatetime как дата) как дата2,
Случай когда
Cast([iDateTime] as time) > Cast((select dateadd(mi,-60,StartTime) from shiftMaster where ShiftID=(select ShiftID1 from EmployeeMaster where PunchID=sEnrollNumber)) as time)
и Cast([iDateTime] as time) < Cast((select dateadd(mi,59,StartTime) from shiftMaster where ShiftID=(select ShiftID1 from EmployeeMaster where PunchID=sEnrollNumber)) as time)
и ((функции row_number() над(раздел по [sEnrollNumber] приказ [iDateTime] АСК))%2)=0
затем 'в' еще 'из' конца 'В/' С
PunchingData
где [sEnrollNumber]=3 и iDateTime между '2018-04-01' и '2018-04-30'

1 Ответов

Рейтинг:
0

CHill60

У вас была правильная идея, используя ROW_NUMBER и modulus ( % ), вы просто немного усложняли вещи.
Этот запрос получает данные в аккуратном формате

select E.PunchID, iDateTime,
CASE WHEN ((ROW_NUMBER() OVER(partition BY [sEnrollNumber] ORDER BY [iDateTime] ASC))%2) = 0 THEN 'IN' ELSE 'OUT' END as InOut,
 Cast(iDatetime as date) as date2, ShiftId
from #EmpMaster E
inner join #MachinePunchingData M ON E.PunchID=M.sEnrollNumber
ORDER BY iDateTime
Обратите внимание, что я удалил проверки на номер перфоратора и даты на данный момент, чтобы сделать вещи более ясными, но включил идентификатор сдвига (почему это станет очевидным).:
3	2018-04-03 07:11:10.000	OUT	2018-04-03  1
3	2018-04-03 23:11:19.000	IN	2018-04-03  1
3	2018-04-03 23:40:29.000	OUT	2018-04-03  1
3	2018-04-04 00:11:32.000	IN	2018-04-04  1
3	2018-04-04 01:11:34.000	OUT	2018-04-04  1
3	2018-04-04 05:12:09.000	IN	2018-04-04  1
3	2018-04-04 07:10:26.000	OUT	2018-04-04  1
3	2018-04-04 23:04:28.000	IN	2018-04-04  1
Теперь самое время взглянуть на ваши данные ... этот сотрудник, кажется, много раз входил и выходил из рабочего места во время своей смены! Возможно, вы захотите начать с более простых данных - ровно один вход и ровно один выход за смену.

Однако, придерживаясь того, что у нас есть, вы захотите знать, в какое время они пришли, в какое время они вышли и как долго они работали, предпочтительно все в одном ряду. Вы можете использовать один из следующих способов: Аналитические функции SQL [^] чтобы сделать это. Я собираюсь использовать свинец, чтобы получить "следующий" раз
select E.PunchID,
    idatetime as time1,
    LEAD(iDatetime,1) OVER (partition BY [sEnrollNumber] ORDER BY [iDateTime] ASC) as time2,
    CASE WHEN ((ROW_NUMBER() OVER(partition BY [sEnrollNumber] ORDER BY [iDateTime] ASC))%2) = 0 THEN 'IN' ELSE 'OUT' END as InOut,
    Cast(iDatetime as date) as date2
    ,E.ShiftID
from #EmpMaster E
inner join #MachinePunchingData M ON E.PunchID=M.sEnrollNumber
Результаты:
3	2018-04-03 07:11:10.000	2018-04-03 23:11:19.000	OUT	2018-04-03	1
3	2018-04-03 23:11:19.000	2018-04-03 23:40:29.000	IN	2018-04-03	1
3	2018-04-03 23:40:29.000	2018-04-04 00:11:32.000	OUT	2018-04-03	1
3	2018-04-04 00:11:32.000	2018-04-04 01:11:34.000	IN	2018-04-04	1
3	2018-04-04 01:11:34.000	2018-04-04 05:12:09.000	OUT	2018-04-04	1
3	2018-04-04 05:12:09.000	2018-04-04 07:10:26.000	IN	2018-04-04	1
3	2018-04-04 07:10:26.000	2018-04-04 23:04:28.000	OUT	2018-04-04	1
3	2018-04-04 23:04:28.000	NULL	IN	2018-04-04	1
Заметьте, у нас нет времени, когда он ушел из последней смены!

Вы захотите расширить эти базовые данные, чтобы получить из них реальную информацию, и заметите, что вас действительно интересуют только строки, которые находятся "внутри" (строки "ВНЕ" на самом деле показывают, как долго был сотрудник нет в работе). Для этого я собираюсь предложить вам использовать общее табличное выражение (CTE) ... это помогает сделать сложные запросы более понятными и означает, что вы можете создавать запрос поэтапно, проверяя свои результаты по ходу работы
;with cte AS
(
	select E.PunchID, 
		idatetime as time1,
		LEAD(iDatetime,1) OVER (partition BY [sEnrollNumber] ORDER BY [iDateTime] ASC) as time2,
		CASE WHEN ((ROW_NUMBER() OVER(partition BY [sEnrollNumber] ORDER BY [iDateTime] ASC))%2) = 0 THEN 'IN' ELSE 'OUT' END as InOut,
		Cast(iDatetime as date) as date2
		,E.ShiftID
	from #EmpMaster E
	inner join #MachinePunchingData M ON E.PunchID=M.sEnrollNumber
)
SELECT PunchID, time1,time2, date2
from cte
WHERE InOut = 'IN'
ORDER BY time1
Результаты:
3	2018-04-03 23:11:19.000	2018-04-03 23:40:29.000	2018-04-03
3	2018-04-04 00:11:32.000	2018-04-04 01:11:34.000	2018-04-04
3	2018-04-04 05:12:09.000	2018-04-04 07:10:26.000	2018-04-04
3	2018-04-04 23:04:28.000	NULL	2018-04-04
Это поможет тебе продержаться какое-то время.