SQL - Consulta SQL, primer y ultimo registro por dia

 
Vista:

Consulta SQL, primer y ultimo registro por dia

Publicado por Alberto (1 intervención) el 22/08/2011 14:04:24
Hola!!! estoy un poco justo de SQL y necesito sacar de la siguiente tabla correspondiente a un control de accesos, los datos por empleado y dia de hora de entrada y hora de salida. Los usuarios en un mismo dia pueden tener varias entradas y salidas, por lo que solo necesito sacar el primer y el ultimo registro por dia.


Tabla origen:

In/out_______ DiaHora_________idempleado

In_________11/08/2011 14:01:02_______8
OUT_______11/08/2011 16:15:00_______8
IN_________01/08/2011 14:22:33______ 7
In_________08/08/2011 18:00:00_______ 9
OUT_______08/08/2011 19:01:02_______9



Consulta Objetivo:

Dia________Hora In_______Hora Out______Idempleado

11/08/2011___14:01:02______16:15:00___________8
01/08/2011___14:22:33________________________7
08/08/2011___18:00:00______19:01:02___________9

En la tabla origen el campo DiaHora es de tipo Datetime
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

Consulta SQL, primer y ultimo registro por dia

Publicado por jams (16 intervenciones) el 24/08/2011 21:13:50
no dices que manejador de BD usas, este ejemplo que te paso es con sql server,pruebalo ojala y te sirva

declare @tabla table(inout varchar(5),fecha datetime,idempleado int)


insert into @tabla values('in','11/08/2011 14:01:01',8)
insert into @tabla values('out','11/08/2011 16:15:00',8)
insert into @tabla values('in','01/08/2011 14:22:33',7)
insert into @tabla values('in','08/08/2011 18:00:01',9)
insert into @tabla values('out','08/08/2011 19:01:02',9)

select fechai,fechas,idempleado from
(
select fecha as fechai,case when (select max(fecha) from @tabla a where a.idempleado=b.idempleado) = fecha then null else (select max(fecha) from @tabla a where a.idempleado=b.idempleado) end as fechas,idempleado from @tabla b) x

where fechai <> fechas and
(select count(*) from @tabla where idempleado = x.idempleado) > 1 or
(select count(*) from @tabla where idempleado = x.idempleado) = 1

order by idempleado

Saludos y suerte
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
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Consulta SQL, primer y ultimo registro por dia

Publicado por leonardo_josue (1173 intervenciones) el 26/08/2011 19:01:38
hola compañeros:

Hay un pequeño detalle en el código de jams, que no se observa con los datos que pones de ejemplo, pero que había que tomar en cuenta y es el hecho de que existan registros sólo de salida (sin entrada) o de que un empleado tenga varias entradas y salidas durante un mismo día. Yo obtuve otra alternativa:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
declare @tabla table(inout varchar(5),fecha datetime,idempleado int)
insert into @tabla values('in','11/08/2011 14:01:01',8)
insert into @tabla values('out','11/08/2011 16:15:00',8)
insert into @tabla values('in','11/08/2011 16:16:01',8)
insert into @tabla values('out','11/08/2011 19:00:00',8)
insert into @tabla values('in','01/08/2011 14:22:33',7)
insert into @tabla values('in','08/08/2011 18:00:01',9)
insert into @tabla values('out','08/08/2011 19:01:02',9)
insert into @tabla values('out','08/08/2011 19:01:02',10)
 
select * from @tabla
 
/*
inout fecha                   idempleado
----- ----------------------- -----------
in    2011-11-08 14:01:01.000 8
out   2011-11-08 16:15:00.000 8
in    2011-11-08 16:16:01.000 8
out   2011-11-08 19:00:00.000 8
in    2011-01-08 14:22:33.000 7
in    2011-08-08 18:00:01.000 9
out   2011-08-08 19:01:02.000 9
out   2011-08-08 19:01:02.000 10
*/
 
select
case when T1.min_fecha is not null then convert(varchar, T1.min_fecha, 103)
else convert(varchar, T2.max_fecha, 103) end fecha,
convert(varchar, T1.min_fecha, 108) hora_in,
convert(varchar, T2.max_fecha, 108) hora_out,
case when T1.idempleado is not null then T1.idempleado
else T2.idempleado end idempleado
from
(select idempleado, min(fecha) min_fecha from @tabla
where inout = 'in' group by idempleado) T1
full outer join
(select idempleado, max(fecha) max_fecha from @tabla
where inout = 'out' group by idempleado) T2
on
T1.idempleado = T2.idempleado
order by T2.idempleado
/*
fecha       hora_in   hora_out   idempleado
----------  --------  ---------  -----------
08/01/2011  14:22:33  NULL       7
08/11/2011  14:01:01  19:00:00   8
08/08/2011  18:00:01  19:01:02   9
08/08/2011  NULL      19:01:02   10
*/


Es cuestión de que revises si alguna de las dos opciones te sirve, y si continuas con problemas lo comentas en el foro

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