Fechas Sobrepuestas

25/02/2005 - 01:31 por Pablo Guevara | Informe spam
Necesito hacer una consulta con registros que tienen una fecha inicial y
fecha final. Me piden que no se pueda ingresar una fecha que ya este
incluida en el periodo, poer ejemplo:

Enero 01/2005 - Diciembre 31/2005

Si intentamos ingresar :

Julio 01/2005 Julio 21/2006

el sistema confirma que la fecha se sobrepone a una ya existente.

¿Alguna idea?

Thx

Pablo

+++
 

Leer las respuestas

#1 Jorge Bustos
25/02/2005 - 02:14 | Informe spam
create table t (i datetime, f datetime)
insert into t values ('20050101','20050131')


insertar y uno concreto que estés vigilando en la tabla:
1)
i--f
@
por ejemplo del 15 de enero al 15 de febrero

2)
i--f
@
por ejemplo del 31 de diciembre anterior al 15 de enero

3)
i--f
@
por ejemplo del 10 al 20 de enero

4)
i--f
@
por ejemplo del 1 de diciembre anterior al 1 de febrero

Para localizar estos posibles casos de intersección hay que realizar estas
consultas:
(OJO: pseudocódigo para entender mejor la exlicación. el código final va en
el procedimiento)
1) select * from t where t.i<=@ni<=t.f
2) select * from t where t.i<=@nf<=t.f
3) cualquiera de las comprobaciones 1) y 2) reconocen esta intersección
4) serían dos consultas:
select * from t where @ni<=t.i<=@nf
select * from t where @ni<=t.f<=@nf
Pero con comprobar que o bien i o bien f estén dentro de el rango entre ni y
nf basta para saber que se solapan

En resumen, para comprobar si un rango está ocupado basta con:

create procedure disponible
@ni datetime, @nf datetime
as
begin
select count(*) from t
where
(t.i<=@ni and @ni<=t.f)
or
(t.i<=@nf and @nf<=t.f)
or
(@ni<=t.i and t.i<=@nf)
end

Si la cuenta devuelta es mayor que cero el periodo está ocupado.

Puedes comprobar los 6 casos posibles (4 intersecciones de arriba, y dos que
no tienen intersección)
exec disponible '20050115','20050215'
exec disponible '20041231','20050115'
exec disponible '20050110','20050120'
exec disponible '20041201','20050201'
exec disponible '20041201','20041215'
exec disponible '20051201','20051215'

Ahora solo faltaría llamar a este proc. almacenado como comprobación o
convertirlo en trigger, pero la lógica ya está definida.

Salu2,
Jorge


"Pablo Guevara" wrote in message
news:OjD32$
Necesito hacer una consulta con registros que tienen una fecha inicial y
fecha final. Me piden que no se pueda ingresar una fecha que ya este
incluida en el periodo, poer ejemplo:

Enero 01/2005 - Diciembre 31/2005

Si intentamos ingresar :

Julio 01/2005 Julio 21/2006

el sistema confirma que la fecha se sobrepone a una ya existente.

¿Alguna idea?

Thx

Pablo

+++


Preguntas similares