none
Mostrar Asistencia de Personal RRS feed

  • Pregunta

  • Buenos dias, espero me puedan orientar con mi duda tengo una tabla donde se almacenan eventos de reloj

    IDEvento   Legajo  TipoMov Fecha Hora

    1  88589 E  2016/08/17 08:20

    2  88589 E  2016/08/17 08:20

    3  88589 S  2016/08/17 10:22

    4  88589 E  2016/08/17 11:20

    5  88589 E  2016/08/17 11:20

    6  88589 E  2016/08/17 18:59

    Y quisiera resumir todos los eventos, creando una consulta que tome la primera entrada y la ultima salida

    Legajo Fecha          Entrada Salida

    88589 2016/08/17 08:20    18:59

    jueves, 17 de agosto de 2017 15:22

Respuestas

  • A ver si este ejemplo te sirve de inspiración:

    create table Prueba (
        IDEvento int identity primary key,
    	Legajo varchar(10),
    	TipoMov char(1),
    	FechaHora datetime
    )
    go
    insert prueba (Legajo, TipoMov, FechaHora) values
        ('88589',  'E', '2016/08/17 08:20'),
        ('88589',  'E', '2016/08/17 08:20'),
        ('88589',  'S', '2016/08/17 10:22'),
        ('88589',  'E', '2016/08/17 11:20'),
        ('88589',  'E', '2016/08/17 11:20'),
        ('88589',  'S', '2016/08/17 18:59')
    go
    
    select E.legajo, e.Dia, e.hora as Entrada, s.hora as Salida from
    (select legajo, 'E' as TipoMov, cast(FechaHora as date) as Dia, min(cast(FechaHora as time)) as Hora
    from Prueba where TipoMov='E'
    group by Legajo, cast(FechaHora as date)) as E
    full outer join
    (select legajo, 'S' as TipoMov, cast(FechaHora as date) as Dia, max(cast(FechaHora as time)) as Hora
    from Prueba where TipoMov='S'
    group by Legajo, cast(FechaHora as date)) as S
    on e.Legajo=S.legajo and e.Dia=S.Dia
    go

    • Propuesto como respuesta osrol jueves, 17 de agosto de 2017 18:41
    • Marcado como respuesta Moderador M miércoles, 23 de agosto de 2017 19:23
    jueves, 17 de agosto de 2017 18:02
  • Si el primer evento es una entrada y el último evento una salida entonces la consulta es muy simple:

    SELECT 
        t.Legajo, CONVERT(date, t.FechaHora) Fecha,
        MIN(CONVERT(time(0), t.FechaHora)) Entrada,
        MAX(CONVERT(time(0), t.FechaHora)) Salida
    FROM
        dbo.TableName t
    GROUP BY t.Legajo, CONVERT(date, t.FechaHora)
    GO

    Sin embargo, es posible que bajo ciertas circunstancias el registro de eventos no tenga la secuencia ideal, es decir que el primer evento no sea una entrada o que el último evento no sea una salida (por problemas del dispositivo biometrico o cualquier otra circunstancia), en ese sentido sería conveniente evidenciar el suceso para que se tomen las medidas pertinentes, por ejemplo:

    SELECT 
        t.Legajo, CONVERT(date, t.FechaHora) Fecha,
        CASE 
    	   WHEN MIN(h.Hora) = MIN(CASE WHEN t.TipoMov = 'E' THEN h.Hora END) THEN MIN(h.Hora)
        END Entrada,
        CASE 
    	   WHEN MAX(h.Hora) = MAX(CASE WHEN t.TipoMov = 'S' THEN h.Hora END) THEN MAX(h.Hora)
        END Salida
    FROM
        dbo.TableName t
        CROSS APPLY (SELECT CONVERT(time(0), t.FechaHora) Hora) h
    GROUP BY t.Legajo, CONVERT(date, t.FechaHora)
    GO


    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    • Marcado como respuesta Moderador M miércoles, 23 de agosto de 2017 19:23
    viernes, 18 de agosto de 2017 0:46

Todas las respuestas

  • A ver si este ejemplo te sirve de inspiración:

    create table Prueba (
        IDEvento int identity primary key,
    	Legajo varchar(10),
    	TipoMov char(1),
    	FechaHora datetime
    )
    go
    insert prueba (Legajo, TipoMov, FechaHora) values
        ('88589',  'E', '2016/08/17 08:20'),
        ('88589',  'E', '2016/08/17 08:20'),
        ('88589',  'S', '2016/08/17 10:22'),
        ('88589',  'E', '2016/08/17 11:20'),
        ('88589',  'E', '2016/08/17 11:20'),
        ('88589',  'S', '2016/08/17 18:59')
    go
    
    select E.legajo, e.Dia, e.hora as Entrada, s.hora as Salida from
    (select legajo, 'E' as TipoMov, cast(FechaHora as date) as Dia, min(cast(FechaHora as time)) as Hora
    from Prueba where TipoMov='E'
    group by Legajo, cast(FechaHora as date)) as E
    full outer join
    (select legajo, 'S' as TipoMov, cast(FechaHora as date) as Dia, max(cast(FechaHora as time)) as Hora
    from Prueba where TipoMov='S'
    group by Legajo, cast(FechaHora as date)) as S
    on e.Legajo=S.legajo and e.Dia=S.Dia
    go

    • Propuesto como respuesta osrol jueves, 17 de agosto de 2017 18:41
    • Marcado como respuesta Moderador M miércoles, 23 de agosto de 2017 19:23
    jueves, 17 de agosto de 2017 18:02
  • Si el primer evento es una entrada y el último evento una salida entonces la consulta es muy simple:

    SELECT 
        t.Legajo, CONVERT(date, t.FechaHora) Fecha,
        MIN(CONVERT(time(0), t.FechaHora)) Entrada,
        MAX(CONVERT(time(0), t.FechaHora)) Salida
    FROM
        dbo.TableName t
    GROUP BY t.Legajo, CONVERT(date, t.FechaHora)
    GO

    Sin embargo, es posible que bajo ciertas circunstancias el registro de eventos no tenga la secuencia ideal, es decir que el primer evento no sea una entrada o que el último evento no sea una salida (por problemas del dispositivo biometrico o cualquier otra circunstancia), en ese sentido sería conveniente evidenciar el suceso para que se tomen las medidas pertinentes, por ejemplo:

    SELECT 
        t.Legajo, CONVERT(date, t.FechaHora) Fecha,
        CASE 
    	   WHEN MIN(h.Hora) = MIN(CASE WHEN t.TipoMov = 'E' THEN h.Hora END) THEN MIN(h.Hora)
        END Entrada,
        CASE 
    	   WHEN MAX(h.Hora) = MAX(CASE WHEN t.TipoMov = 'S' THEN h.Hora END) THEN MAX(h.Hora)
        END Salida
    FROM
        dbo.TableName t
        CROSS APPLY (SELECT CONVERT(time(0), t.FechaHora) Hora) h
    GROUP BY t.Legajo, CONVERT(date, t.FechaHora)
    GO


    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    • Marcado como respuesta Moderador M miércoles, 23 de agosto de 2017 19:23
    viernes, 18 de agosto de 2017 0:46