SQL - Corregir Marcacion en asistencia de personal

 
Vista:
sin imagen de perfil
Val: 6
Ha aumentado su posición en 5 puestos en SQL (en relación al último mes)
Gráfica de SQL

Corregir Marcacion en asistencia de personal

Publicado por Abraham (4 intervenciones) el 10/09/2018 04:00:29
Buen dia, estoy usando el sql server 2012 y la tabla que tengo es la siguiente:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
create table Asistencia (ID_TRABAJADOR int, FechaAsistencia datetime)
go
insert into Asistencia (ID_TRABAJADOR, FechaAsistencia) values
(3,    '20180906 21:55:08.000'),
(3,    '20180906 21:55:44.000'),
(3,    '20180906 21:56:32.000'),
(3,    '20180907 22:21:24.000'),
(13,'20180906 21:55:28.000'),
(13,'20180906 21:56:24.000'),
(13,'20180906 22:00:59.000'),
(13,'20180906 22:05:40.000'),
(13,'20180906 22:19:24.000'),
(13,'20180906 22:21:03.000'),
(13,'20180906 22:21:54.000')
Go


-- Esta la consulta que muestra el siguiente resultado
SELECT Asistencia.Id_Trabajador AS ID_TRABAJADOR, FechaAsistencia AS FECHA,
row_number() OVER (PARTITION BY Asistencia.Id_Trabajador
ORDER BY (FechaAsistencia)) AS FILA, (CASE WHEN (row_number() OVER (PARTITION BY Asistencia.Id_Trabajador
ORDER BY (FechaAsistencia))) % 2 = '0' THEN 'SALIDA' ELSE 'ENTRADA' END) AS ENTRADA_SALIDA
FROM dbo.Asistencia
GROUP BY FechaAsistencia, Id_Trabajador

1324005

Como ven cada numeo impar es entrada e impar es salida, ahora lo que quiero cambiar es que cuando entre una entrada y salida haya una diferencia de 24 horas o mas la salida, sea considerada como entrada y por lo tanto sus demas filas tambien cambiarian, como se ve en la imagen mostrada a continuacion

1324004555

¿Como podria lograr conseguir este resultado?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Corregir Marcacion en asistencia de personal

Publicado por Leonardo Josué (1173 intervenciones) el 11/09/2018 21:31:45
Hola Abraham:

Mucho ojo, en primer lugar, el script que pones para crear la tabla e introducir los datos NO COINCIDE CON LO QUE PONES EN LA IMAGEN... para el empleado 13 TODAS LAS FECHAS QUE METES A LA TABLA SON DEL MISMO DÍA.

En segundo lugar, en tu post dices que si entre una fecha y otra PASAN MÁS DE 24 HORAS ENTONCES SE TIENE QUE REINICIAR como entrada, sin embargo, en el segundo ejemplo en realidad NO HAN TRANSCURRIDO LAS 24 HORAS QUE MENCIONAS EN TU POST.

La fila 3 del trabajador 13 tiene una fecha de asistencia del día 20-09-06 22:00:59.000
La fila 3 del trabajador 13 tiene una fecha de asistencia del día 20-09-07 20:05:40.000

por lo tanto, aunque son DÍAS distintos, en realidad la diferencia es de menos de 22 horas...

Si entiendo bien lo que quieres hacer, basta que en el row_numbrer, particiones POR DIA, no solo por el id_del empleado, es decir, hacer algo asi:

1
2
3
4
5
6
7
8
9
10
11
SELECT
  Asistencia.Id_Trabajador AS ID_TRABAJADOR,
  FechaAsistencia AS FECHA,
  ROW_NUMBER() OVER (PARTITION BY Asistencia.Id_Trabajador, cast(FechaAsistencia As Date)
                     ORDER BY (FechaAsistencia)) AS FILA,
  (CASE WHEN (row_number() OVER (PARTITION BY Asistencia.Id_Trabajador, cast(FechaAsistencia As Date)
                                 ORDER BY (FechaAsistencia))) % 2 = '0' THEN 'SALIDA' ELSE 'ENTRADA' END
  ) AS ENTRADA_SALIDA
FROM dbo.Asistencia
GROUP BY FechaAsistencia, Id_Trabajador
go


esta consulta te debe de regresar algo así:

1
2
3
4
5
6
7
8
9
10
11
12
ID_TRABAJADOR   FECHA                 FILA  ENTRADA_SALIDA
3               2018-09-06T21:55:08Z  1     ENTRADA
3               2018-09-06T21:55:44Z  2     SALIDA
3               2018-09-06T21:56:32Z  3     ENTRADA
3               2018-09-07T22:21:24Z  1     ENTRADA
13              2018-09-06T21:55:28Z  1     ENTRADA
13              2018-09-06T21:56:24Z  2     SALIDA
13              2018-09-06T22:00:59Z  3     ENTRADA
13              2018-09-07T22:05:40Z  1     ENTRADA
13              2018-09-07T22:19:24Z  2     SALIDA
13              2018-09-08T22:21:03Z  1     ENTRADA
13              2018-09-08T22:21:54Z  2     SALIDA

es decir, cada que inicia un nuevo día, el contador de FILA se reinicia en 1.

Haz la prueba y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar