Fechas Solapadas

27/04/2006 - 16:45 por DiegoC | Informe spam
Hola, estoy dando vueltas y no consigo armar una consulta que responda a lo
que necesito, a ver si alguien me puede dar una mano.

Tengo registros con info, que entre los campos tengo FechaDesde,FechaHasta,
HoraDesde, HoraHasta.
El tema es que cuando van a dar de alta un registro, tengo que validar que
no se solape con otro registro que que cubra ese rango de fechas y horas.

No se si me explico bien, por las dudas pongo un ejemplo:



FechaDesde FechaHasta HoraDesde HoraHasta
#1 01/01/05 10/01/05 08:00 10:00
#2 09/01/05 01/01/06 11:00 12:00

Al ingresar:
01/04/05 04/04/06 11:00 11:30 ERROR, no me lo
tendria que dejar ya que se solapa con el Reg2

Desde ya mchas gracias.

Saludos, Diego

Preguntas similare

Leer las respuestas

#1 Victor Koch
27/04/2006 - 18:13 | Informe spam
Hola Diego,

A ver analicemos los casos, graficamente nosotros tendriamos estas
combinaciones:

0. ++
1. +-+
2. +--+
3. +--+
4. ++

Si vemos el gráfico podríamos decir que si Desde es mayor o igual al campo
FechaDesde y menor o igual al campo HastaFecha no debería insertarce el
registro, con esta parte solucionamos el caso 2 y 4, también podemos decir
que si el campo Hasta es mayor o igual al campo FechaDesde y menor o igual
al campo HastaFecha tampoco debería insertarce el registro, con esta segunda
parte solucionamos el caso 1, por ultimo nos queda el caso 3, podríamos
decir que si Desde es menor o igual al campo FechaDesde y mayor o igual al
campo HastaFecha no debería insertarce el registro.
En resumen la sentencia debería ser:

SELECT * FROM mitabla WHERE
((Desde>=FechaDesde AND Desde<=FechaHasta)
OR
(Hasta>=FechaDesde AND Hasta<=FechaHasta)
OR
(Desde<=FechaDesde AND Hasta>=FechaHasta))

Si este select devuelve por lo menos un registro "NO" se debe insertar el
nuevo registro.
Faltaria agregar los controles de las fechas, particularmente creo que
hubiera sido mejor guardar la fecha y hora en un solo campo.

Un saludo, Víctor Koch.


"DiegoC" escribió en el mensaje
news:
Hola, estoy dando vueltas y no consigo armar una consulta que responda a


lo
que necesito, a ver si alguien me puede dar una mano.

Tengo registros con info, que entre los campos tengo


FechaDesde,FechaHasta,
HoraDesde, HoraHasta.
El tema es que cuando van a dar de alta un registro, tengo que validar que
no se solape con otro registro que que cubra ese rango de fechas y horas.

No se si me explico bien, por las dudas pongo un ejemplo:



FechaDesde FechaHasta HoraDesde HoraHasta
#1 01/01/05 10/01/05 08:00 10:00
#2 09/01/05 01/01/06 11:00 12:00

Al ingresar:
01/04/05 04/04/06 11:00 11:30 ERROR, no me lo
tendria que dejar ya que se solapa con el Reg2

Desde ya mchas gracias.

Saludos, Diego


Respuesta Responder a este mensaje
#2 DiegoC
27/04/2006 - 20:30 | Informe spam
Muchisimas Gracias ya complete la sentencia con la parte de la Hora y
funciona barbaro.
Muy Buena Explicacion !!!!

Saludos, y gracias por la ayuda !!!

Diego



"Victor Koch" <v i c t o r (arroba)correo(punto)waldbott(punto)com(punto)ar>
escribió en el mensaje news:%
Hola Diego,

A ver analicemos los casos, graficamente nosotros tendriamos estas
combinaciones:

0. ++
1. +-+
2. +--+
3. +--+
4. ++

Si vemos el gráfico podríamos decir que si Desde es mayor o igual al campo
FechaDesde y menor o igual al campo HastaFecha no debería insertarce el
registro, con esta parte solucionamos el caso 2 y 4, también podemos decir
que si el campo Hasta es mayor o igual al campo FechaDesde y menor o igual
al campo HastaFecha tampoco debería insertarce el registro, con esta
segunda
parte solucionamos el caso 1, por ultimo nos queda el caso 3, podríamos
decir que si Desde es menor o igual al campo FechaDesde y mayor o igual al
campo HastaFecha no debería insertarce el registro.
En resumen la sentencia debería ser:

SELECT * FROM mitabla WHERE
((Desde>=FechaDesde AND Desde<=FechaHasta)
OR
(Hasta>=FechaDesde AND Hasta<=FechaHasta)
OR
(Desde<=FechaDesde AND Hasta>=FechaHasta))

Si este select devuelve por lo menos un registro "NO" se debe insertar el
nuevo registro.
Faltaria agregar los controles de las fechas, particularmente creo que
hubiera sido mejor guardar la fecha y hora en un solo campo.

Un saludo, Víctor Koch.


"DiegoC" escribió en el mensaje
news:
Hola, estoy dando vueltas y no consigo armar una consulta que responda a


lo
que necesito, a ver si alguien me puede dar una mano.

Tengo registros con info, que entre los campos tengo


FechaDesde,FechaHasta,
HoraDesde, HoraHasta.
El tema es que cuando van a dar de alta un registro, tengo que validar
que
no se solape con otro registro que que cubra ese rango de fechas y horas.

No se si me explico bien, por las dudas pongo un ejemplo:



FechaDesde FechaHasta HoraDesde HoraHasta
#1 01/01/05 10/01/05 08:00 10:00
#2 09/01/05 01/01/06 11:00 12:00

Al ingresar:
01/04/05 04/04/06 11:00 11:30 ERROR, no me lo
tendria que dejar ya que se solapa con el Reg2

Desde ya mchas gracias.

Saludos, Diego






Respuesta Responder a este mensaje
#3 Alejandro Mesa
27/04/2006 - 21:54 | Informe spam
DiegoC,

Tambien podemos usar la negacion. Si existe alguna fila donde se solapen las
fechas con las de la fila que se quiere insertar entonces no hay problema.
Crea una funcion que acepte como parametro la clave primaria de la tabla y
las fechas "desde" y "hasta", y que devuelva cero o uno si existe alguna file
donde sus fecha se solapen con las fechas de la fila que se quiere insertar.
Luego puedes usar esta funcion en una restriccion "check".

use northwind
go

create function dbo.overlaps(
@pk int,
@sd datetime,
@ed datetime
)
returns integer
begin
if exists (
select *
from dbo.t1
where
c1 <> @pk
and not (start_date > @ed or end_date < @sd)
)
return 1

return 0
end
go

create table dbo.t1
(
c1 integer not null primary key,
start_date datetime not null unique,
end_date datetime not null unique,
check (start_date < end_date),
constraint date_overlap check (dbo.overlaps(c1, start_date, end_date) = 0)
)
go

insert into dbo.t1 values(1, '20030101', '20030901')
go

insert into dbo.t1 values(2, '20030902', '20030911')
go

insert into dbo.t1 values(3, '20030910', '20030915')
go

select * from dbo.t1
go

drop table dbo.t1
drop function Overlaps
go

Esta funcion la tome hace mucho tiempo de un post en el grupo sql server en
ingles.


AMB


"DiegoC" wrote:

Muchisimas Gracias ya complete la sentencia con la parte de la Hora y
funciona barbaro.
Muy Buena Explicacion !!!!

Saludos, y gracias por la ayuda !!!

Diego



"Victor Koch" <v i c t o r (arroba)correo(punto)waldbott(punto)com(punto)ar>
escribió en el mensaje news:%
> Hola Diego,
>
> A ver analicemos los casos, graficamente nosotros tendriamos estas
> combinaciones:
>
> 0. ++
> 1. +-+
> 2. +--+
> 3. +--+
> 4. ++
>
> Si vemos el gráfico podríamos decir que si Desde es mayor o igual al campo
> FechaDesde y menor o igual al campo HastaFecha no debería insertarce el
> registro, con esta parte solucionamos el caso 2 y 4, también podemos decir
> que si el campo Hasta es mayor o igual al campo FechaDesde y menor o igual
> al campo HastaFecha tampoco debería insertarce el registro, con esta
> segunda
> parte solucionamos el caso 1, por ultimo nos queda el caso 3, podríamos
> decir que si Desde es menor o igual al campo FechaDesde y mayor o igual al
> campo HastaFecha no debería insertarce el registro.
> En resumen la sentencia debería ser:
>
> SELECT * FROM mitabla WHERE
> ((Desde>=FechaDesde AND Desde<=FechaHasta)
> OR
> (Hasta>=FechaDesde AND Hasta<=FechaHasta)
> OR
> (Desde<=FechaDesde AND Hasta>=FechaHasta))
>
> Si este select devuelve por lo menos un registro "NO" se debe insertar el
> nuevo registro.
> Faltaria agregar los controles de las fechas, particularmente creo que
> hubiera sido mejor guardar la fecha y hora en un solo campo.
>
> Un saludo, Víctor Koch.
>
>
> "DiegoC" escribió en el mensaje
> news:
>> Hola, estoy dando vueltas y no consigo armar una consulta que responda a
> lo
>> que necesito, a ver si alguien me puede dar una mano.
>>
>> Tengo registros con info, que entre los campos tengo
> FechaDesde,FechaHasta,
>> HoraDesde, HoraHasta.
>> El tema es que cuando van a dar de alta un registro, tengo que validar
>> que
>> no se solape con otro registro que que cubra ese rango de fechas y horas.
>>
>> No se si me explico bien, por las dudas pongo un ejemplo:
>>
>>
>>
>> FechaDesde FechaHasta HoraDesde HoraHasta
>> #1 01/01/05 10/01/05 08:00 10:00
>> #2 09/01/05 01/01/06 11:00 12:00
>>
>> Al ingresar:
>> 01/04/05 04/04/06 11:00 11:30 ERROR, no me lo
>> tendria que dejar ya que se solapa con el Reg2
>>
>> Desde ya mchas gracias.
>>
>> Saludos, Diego
>>
>>
>
>



Respuesta Responder a este mensaje
#4 Alejandro Mesa
27/04/2006 - 22:04 | Informe spam
DiegoC,

Tambien podemos usar la negacion. Si existe alguna fila donde se solapen las
fechas con las de la fila que se quiere insertar entonces no hay problema.



Lo que trate de decir fue lo siguiente. Las fechas no se solapan si se
cumple que:

fechadesde > @ed or fechahasta < @sd

donde:

@sd -> fecha inicio que se desea insertar
@ed -> fecha final que se desea insertar

por lo que si existe una fila donde se cumple la negacion:

NOT (fechadesde > @ed or fechahasta < @sd)

entonces existe una fila cuyas fechas se solapan con las fechas que se
desean insertar.


AMB

"Alejandro Mesa" wrote:

DiegoC,

Tambien podemos usar la negacion. Si existe alguna fila donde se solapen las
fechas con las de la fila que se quiere insertar entonces no hay problema.
Crea una funcion que acepte como parametro la clave primaria de la tabla y
las fechas "desde" y "hasta", y que devuelva cero o uno si existe alguna file
donde sus fecha se solapen con las fechas de la fila que se quiere insertar.
Luego puedes usar esta funcion en una restriccion "check".

use northwind
go

create function dbo.overlaps(
@pk int,
@sd datetime,
@ed datetime
)
returns integer
begin
if exists (
select *
from dbo.t1
where
c1 <> @pk
and not (start_date > @ed or end_date < @sd)
)
return 1

return 0
end
go

create table dbo.t1
(
c1 integer not null primary key,
start_date datetime not null unique,
end_date datetime not null unique,
check (start_date < end_date),
constraint date_overlap check (dbo.overlaps(c1, start_date, end_date) = 0)
)
go

insert into dbo.t1 values(1, '20030101', '20030901')
go

insert into dbo.t1 values(2, '20030902', '20030911')
go

insert into dbo.t1 values(3, '20030910', '20030915')
go

select * from dbo.t1
go

drop table dbo.t1
drop function Overlaps
go

Esta funcion la tome hace mucho tiempo de un post en el grupo sql server en
ingles.


AMB


"DiegoC" wrote:

> Muchisimas Gracias ya complete la sentencia con la parte de la Hora y
> funciona barbaro.
> Muy Buena Explicacion !!!!
>
> Saludos, y gracias por la ayuda !!!
>
> Diego
>
>
>
> "Victor Koch" <v i c t o r (arroba)correo(punto)waldbott(punto)com(punto)ar>
> escribió en el mensaje news:%
> > Hola Diego,
> >
> > A ver analicemos los casos, graficamente nosotros tendriamos estas
> > combinaciones:
> >
> > 0. ++
> > 1. +-+
> > 2. +--+
> > 3. +--+
> > 4. ++
> >
> > Si vemos el gráfico podríamos decir que si Desde es mayor o igual al campo
> > FechaDesde y menor o igual al campo HastaFecha no debería insertarce el
> > registro, con esta parte solucionamos el caso 2 y 4, también podemos decir
> > que si el campo Hasta es mayor o igual al campo FechaDesde y menor o igual
> > al campo HastaFecha tampoco debería insertarce el registro, con esta
> > segunda
> > parte solucionamos el caso 1, por ultimo nos queda el caso 3, podríamos
> > decir que si Desde es menor o igual al campo FechaDesde y mayor o igual al
> > campo HastaFecha no debería insertarce el registro.
> > En resumen la sentencia debería ser:
> >
> > SELECT * FROM mitabla WHERE
> > ((Desde>=FechaDesde AND Desde<=FechaHasta)
> > OR
> > (Hasta>=FechaDesde AND Hasta<=FechaHasta)
> > OR
> > (Desde<=FechaDesde AND Hasta>=FechaHasta))
> >
> > Si este select devuelve por lo menos un registro "NO" se debe insertar el
> > nuevo registro.
> > Faltaria agregar los controles de las fechas, particularmente creo que
> > hubiera sido mejor guardar la fecha y hora en un solo campo.
> >
> > Un saludo, Víctor Koch.
> >
> >
> > "DiegoC" escribió en el mensaje
> > news:
> >> Hola, estoy dando vueltas y no consigo armar una consulta que responda a
> > lo
> >> que necesito, a ver si alguien me puede dar una mano.
> >>
> >> Tengo registros con info, que entre los campos tengo
> > FechaDesde,FechaHasta,
> >> HoraDesde, HoraHasta.
> >> El tema es que cuando van a dar de alta un registro, tengo que validar
> >> que
> >> no se solape con otro registro que que cubra ese rango de fechas y horas.
> >>
> >> No se si me explico bien, por las dudas pongo un ejemplo:
> >>
> >>
> >>
> >> FechaDesde FechaHasta HoraDesde HoraHasta
> >> #1 01/01/05 10/01/05 08:00 10:00
> >> #2 09/01/05 01/01/06 11:00 12:00
> >>
> >> Al ingresar:
> >> 01/04/05 04/04/06 11:00 11:30 ERROR, no me lo
> >> tendria que dejar ya que se solapa con el Reg2
> >>
> >> Desde ya mchas gracias.
> >>
> >> Saludos, Diego
> >>
> >>
> >
> >
>
>
>
Respuesta Responder a este mensaje
#5 DiegoC
02/05/2006 - 19:47 | Informe spam
Muchas gracias Alejandro.

Saludos, Diego

"Alejandro Mesa" escribió en el
mensaje news:
DiegoC,

Tambien podemos usar la negacion. Si existe alguna fila donde se solapen
las
fechas con las de la fila que se quiere insertar entonces no hay
problema.



Lo que trate de decir fue lo siguiente. Las fechas no se solapan si se
cumple que:

fechadesde > @ed or fechahasta < @sd

donde:

@sd -> fecha inicio que se desea insertar
@ed -> fecha final que se desea insertar

por lo que si existe una fila donde se cumple la negacion:

NOT (fechadesde > @ed or fechahasta < @sd)

entonces existe una fila cuyas fechas se solapan con las fechas que se
desean insertar.


AMB

"Alejandro Mesa" wrote:

DiegoC,

Tambien podemos usar la negacion. Si existe alguna fila donde se solapen
las
fechas con las de la fila que se quiere insertar entonces no hay
problema.
Crea una funcion que acepte como parametro la clave primaria de la tabla
y
las fechas "desde" y "hasta", y que devuelva cero o uno si existe alguna
file
donde sus fecha se solapen con las fechas de la fila que se quiere
insertar.
Luego puedes usar esta funcion en una restriccion "check".

use northwind
go

create function dbo.overlaps(
@pk int,
@sd datetime,
@ed datetime
)
returns integer
begin
if exists (
select *
from dbo.t1
where
c1 <> @pk
and not (start_date > @ed or end_date < @sd)
)
return 1

return 0
end
go

create table dbo.t1
(
c1 integer not null primary key,
start_date datetime not null unique,
end_date datetime not null unique,
check (start_date < end_date),
constraint date_overlap check (dbo.overlaps(c1, start_date, end_date) =
0)
)
go

insert into dbo.t1 values(1, '20030101', '20030901')
go

insert into dbo.t1 values(2, '20030902', '20030911')
go

insert into dbo.t1 values(3, '20030910', '20030915')
go

select * from dbo.t1
go

drop table dbo.t1
drop function Overlaps
go

Esta funcion la tome hace mucho tiempo de un post en el grupo sql server
en
ingles.


AMB


"DiegoC" wrote:

> Muchisimas Gracias ya complete la sentencia con la parte de la Hora y
> funciona barbaro.
> Muy Buena Explicacion !!!!
>
> Saludos, y gracias por la ayuda !!!
>
> Diego
>
>
>
> "Victor Koch" <v i c t o r
> (arroba)correo(punto)waldbott(punto)com(punto)ar>
> escribió en el mensaje news:%
> > Hola Diego,
> >
> > A ver analicemos los casos, graficamente nosotros tendriamos
> > estas
> > combinaciones:
> >
> > 0. ++
> > 1. +-+
> > 2. +--+
> > 3. +--+
> > 4. ++
> >
> > Si vemos el gráfico podríamos decir que si Desde es mayor o igual al
> > campo
> > FechaDesde y menor o igual al campo HastaFecha no debería insertarce
> > el
> > registro, con esta parte solucionamos el caso 2 y 4, también podemos
> > decir
> > que si el campo Hasta es mayor o igual al campo FechaDesde y menor o
> > igual
> > al campo HastaFecha tampoco debería insertarce el registro, con esta
> > segunda
> > parte solucionamos el caso 1, por ultimo nos queda el caso 3,
> > podríamos
> > decir que si Desde es menor o igual al campo FechaDesde y mayor o
> > igual al
> > campo HastaFecha no debería insertarce el registro.
> > En resumen la sentencia debería ser:
> >
> > SELECT * FROM mitabla WHERE
> > ((Desde>=FechaDesde AND Desde<=FechaHasta)
> > OR
> > (Hasta>=FechaDesde AND Hasta<=FechaHasta)
> > OR
> > (Desde<=FechaDesde AND Hasta>=FechaHasta))
> >
> > Si este select devuelve por lo menos un registro "NO" se debe
> > insertar el
> > nuevo registro.
> > Faltaria agregar los controles de las fechas, particularmente creo
> > que
> > hubiera sido mejor guardar la fecha y hora en un solo campo.
> >
> > Un saludo, Víctor Koch.
> >
> >
> > "DiegoC" escribió en el mensaje
> > news:
> >> Hola, estoy dando vueltas y no consigo armar una consulta que
> >> responda a
> > lo
> >> que necesito, a ver si alguien me puede dar una mano.
> >>
> >> Tengo registros con info, que entre los campos tengo
> > FechaDesde,FechaHasta,
> >> HoraDesde, HoraHasta.
> >> El tema es que cuando van a dar de alta un registro, tengo que
> >> validar
> >> que
> >> no se solape con otro registro que que cubra ese rango de fechas y
> >> horas.
> >>
> >> No se si me explico bien, por las dudas pongo un ejemplo:
> >>
> >>
> >>
> >> FechaDesde FechaHasta HoraDesde HoraHasta
> >> #1 01/01/05 10/01/05 08:00 10:00
> >> #2 09/01/05 01/01/06 11:00 12:00
> >>
> >> Al ingresar:
> >> 01/04/05 04/04/06 11:00 11:30 ERROR, no
> >> me lo
> >> tendria que dejar ya que se solapa con el Reg2
> >>
> >> Desde ya mchas gracias.
> >>
> >> Saludos, Diego
> >>
> >>
> >
> >
>
>
>
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida