Diferencia entre horas en un mismo campo

18/04/2007 - 19:40 por Cristian Meneses | Informe spam
Buenas a todos

Tengo una bd en SQL Server 2000. Una tabla llamada Logs tiene los
siguientes campos:

IDUsuario -int
Fecha -smalldatetime
Hora -smalldatetime
Entrada -bit (si es 1 = entrada; si es 0 = salida)

Debo realizar las sumatoria de diferencias horarias agrupadas por
fecha y usuario. Por ej

Usuario 85, Fecha '01/04/2007', Hora '11:00:00', Entrada 1
Usuario 85, Fecha '01/04/2007', Hora '19:00:00', Entrada 0
Usuario 24, Fecha '05/04/2007', Hora '10:30:00', Entrada 1 primer
entrada del dia 5
Usuario 85, Fecha '05/04/2007', Hora '10:35:00', Entrada 1
Usuario 24, Fecha '05/04/2007', Hora '12:00:00', Entrada 0 primer
salida del dia 5 (+01:30)
Usuario 85, Fecha '05/04/2007', Hora '18:20:00', Entrada 0
Usuario 24, Fecha '05/04/2007', Hora '17:00:00', Entrada 1 segunda
entrada del dia 5
Usuario 24, Fecha '05/04/2007', Hora '22:00:00', Entrada 0 segunda
salida del dia 5 (+05:00)

De acuerdo a estos registros deberia lograr
85, '01/04/2007', '07:00:00'
24, '05/04/2007', '06:30:00'
85, '05/04/2007', '07:45:00'

Espero que se entienda y lograr solucionarlo, ya que he buscado en
todo el foro algo similar y no encuentro solucion alguna. Muchas
gracias.

Cristian Meneses

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
18/04/2007 - 22:40 | Informe spam
Cristian Meneses,

1 - Me parece que el resultado del [Usuario] = 85 y [Fecha] = '01/04/2007'
debe ser 8 horas.

2 - Esta solucion toma en cuenta que el [Usuario] no tenga una salida
asociada a la ultima entrada de un determinado dia, pero no cuenta los
segundos pasados la media noche.

create table dbo.t1 (
Usuario int not null,
Fecha smalldatetime not null,
Hora smalldatetime not null,
Entrada bit not null
)
go

insert into dbo.t1 values (85, '20070401', '11:00:00', 1)
insert into dbo.t1 values (85, '20070401', '19:00:00', 0)
insert into dbo.t1 values (24, '20070405', '10:30:00', 1)
insert into dbo.t1 values (85, '20070405', '10:35:00', 1)
insert into dbo.t1 values (24, '20070405', '12:00:00', 0)
insert into dbo.t1 values (85, '20070405', '18:20:00', 0)
insert into dbo.t1 values (24, '20070405', '17:00:00', 1)
insert into dbo.t1 values (24, '20070405', '22:00:00', 0)
go

select
Usuario,
Fecha,
sum_segundos / 3600 as horas,
(sum_segundos % 3600) / 60 as minutos,
(sum_segundos % 3600) % 60 as segundos
from
(
select
Usuario,
Fecha,
sum(datediff(second, hora_entrada, hora_salida)) as sum_segundos
from
(
select
Usuario,
Fecha,
Hora as hora_entrada,
coalesce(
(
select
min(b.Hora)
from
dbo.t1 as b
where
b.Usuario = a.Usuario
and b.Fecha = a.Fecha
and b.Hora > a.Hora
and b.Entrada = 0
),
'1900-01-01 23:59:59.997') as hora_salida
from
dbo.t1 as a
where
Entrada = 1
) as t2
group by
Usuario,
Fecha
) as t3
order by
Fecha,
Usuario
go

drop table dbo.t1
go


AMB


"Cristian Meneses" wrote:

Buenas a todos

Tengo una bd en SQL Server 2000. Una tabla llamada Logs tiene los
siguientes campos:

IDUsuario -int
Fecha -smalldatetime
Hora -smalldatetime
Entrada -bit (si es 1 = entrada; si es 0 = salida)

Debo realizar las sumatoria de diferencias horarias agrupadas por
fecha y usuario. Por ej

Usuario 85, Fecha '01/04/2007', Hora '11:00:00', Entrada 1
Usuario 85, Fecha '01/04/2007', Hora '19:00:00', Entrada 0
Usuario 24, Fecha '05/04/2007', Hora '10:30:00', Entrada 1 primer
entrada del dia 5
Usuario 85, Fecha '05/04/2007', Hora '10:35:00', Entrada 1
Usuario 24, Fecha '05/04/2007', Hora '12:00:00', Entrada 0 primer
salida del dia 5 (+01:30)
Usuario 85, Fecha '05/04/2007', Hora '18:20:00', Entrada 0
Usuario 24, Fecha '05/04/2007', Hora '17:00:00', Entrada 1 segunda
entrada del dia 5
Usuario 24, Fecha '05/04/2007', Hora '22:00:00', Entrada 0 segunda
salida del dia 5 (+05:00)

De acuerdo a estos registros deberia lograr
85, '01/04/2007', '07:00:00'
24, '05/04/2007', '06:30:00'
85, '05/04/2007', '07:45:00'

Espero que se entienda y lograr solucionarlo, ya que he buscado en
todo el foro algo similar y no encuentro solucion alguna. Muchas
gracias.

Cristian Meneses


Respuesta Responder a este mensaje
#2 Cristian Meneses
19/04/2007 - 17:06 | Informe spam
Alejandro
Muchas gracias por tu ayuda, el codigo funciona a la perfeccion.
Saludos

Cristian

Alejandro Mesa ha escrito:
Cristian Meneses,

1 - Me parece que el resultado del [Usuario] = 85 y [Fecha] = '01/04/2007'
debe ser 8 horas.

2 - Esta solucion toma en cuenta que el [Usuario] no tenga una salida
asociada a la ultima entrada de un determinado dia, pero no cuenta los
segundos pasados la media noche.

create table dbo.t1 (
Usuario int not null,
Fecha smalldatetime not null,
Hora smalldatetime not null,
Entrada bit not null
)
go

insert into dbo.t1 values (85, '20070401', '11:00:00', 1)
insert into dbo.t1 values (85, '20070401', '19:00:00', 0)
insert into dbo.t1 values (24, '20070405', '10:30:00', 1)
insert into dbo.t1 values (85, '20070405', '10:35:00', 1)
insert into dbo.t1 values (24, '20070405', '12:00:00', 0)
insert into dbo.t1 values (85, '20070405', '18:20:00', 0)
insert into dbo.t1 values (24, '20070405', '17:00:00', 1)
insert into dbo.t1 values (24, '20070405', '22:00:00', 0)
go

select
Usuario,
Fecha,
sum_segundos / 3600 as horas,
(sum_segundos % 3600) / 60 as minutos,
(sum_segundos % 3600) % 60 as segundos
from
(
select
Usuario,
Fecha,
sum(datediff(second, hora_entrada, hora_salida)) as sum_segundos
from
(
select
Usuario,
Fecha,
Hora as hora_entrada,
coalesce(
(
select
min(b.Hora)
from
dbo.t1 as b
where
b.Usuario = a.Usuario
and b.Fecha = a.Fecha
and b.Hora > a.Hora
and b.Entrada = 0
),
'1900-01-01 23:59:59.997') as hora_salida
from
dbo.t1 as a
where
Entrada = 1
) as t2
group by
Usuario,
Fecha
) as t3
order by
Fecha,
Usuario
go

drop table dbo.t1
go


AMB


"Cristian Meneses" wrote:

> Buenas a todos
>
> Tengo una bd en SQL Server 2000. Una tabla llamada Logs tiene los
> siguientes campos:
>
> IDUsuario -int
> Fecha -smalldatetime
> Hora -smalldatetime
> Entrada -bit (si es 1 = entrada; si es 0 = salida)
>
> Debo realizar las sumatoria de diferencias horarias agrupadas por
> fecha y usuario. Por ej
>
> Usuario 85, Fecha '01/04/2007', Hora '11:00:00', Entrada 1
> Usuario 85, Fecha '01/04/2007', Hora '19:00:00', Entrada 0
> Usuario 24, Fecha '05/04/2007', Hora '10:30:00', Entrada 1 primer
> entrada del dia 5
> Usuario 85, Fecha '05/04/2007', Hora '10:35:00', Entrada 1
> Usuario 24, Fecha '05/04/2007', Hora '12:00:00', Entrada 0 primer
> salida del dia 5 (+01:30)
> Usuario 85, Fecha '05/04/2007', Hora '18:20:00', Entrada 0
> Usuario 24, Fecha '05/04/2007', Hora '17:00:00', Entrada 1 segunda
> entrada del dia 5
> Usuario 24, Fecha '05/04/2007', Hora '22:00:00', Entrada 0 segunda
> salida del dia 5 (+05:00)
>
> De acuerdo a estos registros deberia lograr
> 85, '01/04/2007', '07:00:00'
> 24, '05/04/2007', '06:30:00'
> 85, '05/04/2007', '07:45:00'
>
> Espero que se entienda y lograr solucionarlo, ya que he buscado en
> todo el foro algo similar y no encuentro solucion alguna. Muchas
> gracias.
>
> Cristian Meneses
>
>
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida