Principales respuestas
Como saber si un rango de fechas esta dentro de otro rango de fechas

Pregunta
-
Hola foro,
Tengo una tabla con dos columnas : periodoInicial y periodoFinal de tipo Date y necesito hacer un procedimiento almacenado que se encargue de verificar que no se guarden registros duplicados en esta tabla, la regla que indica si un registro es repetido es la siguiente:
"Una registro se entiende duplicado en el sistema, si posee el periodo inicial y final contenidos dentro del rango de periodo inicial y final de un registro definido previamente ..."
Alguna sugerencia para realizar esta consulta ?
Haaaaa, se me olvidaba, estoy trabajando con SQL server 2008 R2 ^_^
Mil gracias !
Un saludo, Cristian Pérez
Respuestas
-
Hola Cristian, prueba con este código para guiarte:
DECLARE @MiTabla as TABLE ( ID_Tabla int, Periodo_Inicial date, Periodo_Final date ) DECLARE @periodo_inicial date='20120601',@periodo_final date='20121001',@w_valor_inicial int SET @w_valor_inicial=(datepart(year,@periodo_inicial)+datepart(month,@periodo_inicial)) INSERT INTO @MiTabla VALUES(1,'20120501','20120801') IF EXISTS(SELECT 1 FROM @MiTabla WHERE (datepart(year,Periodo_Inicial)+datepart(month,Periodo_Inicial))< @w_valor_inicial AND (datepart(year,Periodo_Final)+datepart(month,Periodo_Final))< @w_valor_inicial) PRINT 'RANGO VALIDO' ELSE PRINT 'RANGO INVALIDO'
"How many years can some people exist before they're allowed to be free" Bob Dylan Email: info@geohernandez.com Blog: geeks.ms/blogs/ghernandez
- Marcado como respuesta Cristian Pérez miércoles, 8 de agosto de 2012 21:39
Todas las respuestas
-
En el escenario más simple debes tener una validación previa que garantice que tu periodo inicial sea menor que tu periodo inicial (hablando de variables que contienen dicho rango), dado por sentando que lo manejas de esta forma resulta mas simple validar lo que tu mencionas, por ejemplo:
--Se maneja la validacion para garantizar que el --periodo inicial es inferior al final, haciendo --mas sencillo el manejo --Periodo Inicial:@p_ini --Periodo Final:@p_final
..... From Tabla_Rangos TR Where (TR.p_ini<@p_ini and TR.p_fin<@p_ini)
En este momento no tengo acceso a SQL Server, por ende no te puedo mostrar un escenario mas completo, igual en cuanto tenga acceso posteare un ejemplo, pero espero te sea de utilidad la idea planteada.
"How many years can some people exist before they're allowed to be free" Bob Dylan Email: info@geohernandez.com Blog: geeks.ms/blogs/ghernandez
- Editado Geovanny -Gio- Hernandez lunes, 6 de agosto de 2012 20:16
-
Hola Geovanny,
Gracias por responder, se me olvidaba un pequeño detalle, resulta que apesar de que las columnas son de tipo Date, solo voy hacer la validación por el año y el mes; es decir, en formato: "yyyy/mm", en ese orden de ideas, debo de tener en cuenta algún Convert o Cast para realizar la consulta ????
Nuevamente, gracias por responder !
Un saludo, Cristian Pérez
-
Me iria por el uso de Datepart, ya que quieres extraer segmentos de la fecha y no hacer conversiones, aqui un ejemplo que bien puedes adaptar:
declare @i_fecha_i date, @w_fecha_i date select @i_fecha_i='20120401',@w_fecha_i='20120502' if (datepart(year,@i_fecha_i) + datepart(month,@i_fecha_i)) < (datepart(year,@w_fecha_i) + datepart(month,@w_fecha_i)) print 'Rango Valido'
Realiza la prueba y cualquier duda con gusto te apoyamos."How many years can some people exist before they're allowed to be free" Bob Dylan Email: info@geohernandez.com Blog: geeks.ms/blogs/ghernandez
-
Hola Geovanny,
Gracias por el consejo del uso del DatePart ;)
Tengo un inconveniente a nivel de la condición ....
Ilustre el ejemplo con el formato de fecha dd/mm/aaaa ^_^
Imaginate que tenemos una tabla con dos columnas periodoInicial y periodoFinal de tipo date, y tenemos el siguiente registro:
periodoInicial : 01/05/2012 periodoFinal : 01/08/2012
Y los parametros (@periodoInicial y @periodoFinal) tienen estos valores:
@periodoInicial = 01/06/2012
@periodoFinal = 01/10/2012
Entonces aplicando la condición que planteas sería algo como:
SELECT...
WHERE 05/2012 < 06/2012 AND 08/2012 < 10/2012
Observa que el resultado logico sería verdadero cuando el registro que esta almacenado ya tiene almacenado un rango de dos meses que se estaría volviendo a ingresar ..... :'(
Espero haberme hecho entender !
Cualquier cosa me cuentas !!!!!
Mil gracias por tu tiempo,
Un saludo, Cristian Pérez
- Editado Cristian Pérez lunes, 6 de agosto de 2012 22:06
-
El punto clave Christian como te mencione al inicio es el hecho de que valides (a nivel de Front-End o desde SQL) que tu fecha inicial es menor que la final, asumiendo este punto, no requieres realizar comparaciones o combinaciones tediosas, sino que por decirlo asi solo compararas las fechas iniciales y finales almacenadas en tu tabla contra el parametro de fecha inicial (puesto que no seria necesario hacerlo contra la fecha final puesto que ya se asume que esta es mayor que el parametro de fecha inicial), en un chance que tenga posteare un ejemplo completo con tablas incluidas.
..... From Tabla_Rangos TR Where (TR.p_ini<@p_ini and TR.p_fin<@p_ini)
"How many years can some people exist before they're allowed to be free" Bob Dylan Email: info@geohernandez.com Blog: geeks.ms/blogs/ghernandez
-
-
Hola Cristian, prueba con este código para guiarte:
DECLARE @MiTabla as TABLE ( ID_Tabla int, Periodo_Inicial date, Periodo_Final date ) DECLARE @periodo_inicial date='20120601',@periodo_final date='20121001',@w_valor_inicial int SET @w_valor_inicial=(datepart(year,@periodo_inicial)+datepart(month,@periodo_inicial)) INSERT INTO @MiTabla VALUES(1,'20120501','20120801') IF EXISTS(SELECT 1 FROM @MiTabla WHERE (datepart(year,Periodo_Inicial)+datepart(month,Periodo_Inicial))< @w_valor_inicial AND (datepart(year,Periodo_Final)+datepart(month,Periodo_Final))< @w_valor_inicial) PRINT 'RANGO VALIDO' ELSE PRINT 'RANGO INVALIDO'
"How many years can some people exist before they're allowed to be free" Bob Dylan Email: info@geohernandez.com Blog: geeks.ms/blogs/ghernandez
- Marcado como respuesta Cristian Pérez miércoles, 8 de agosto de 2012 21:39
-
Me parece que lo que buscas es lo siguiente:
Select * From MiTabla T1 Inner Join MiTabla T2 On T1.ID<>T2.ID And T1.PeriodoInicial<=T2.PeriodoFinal And T1.PeriodoFinal>=T2.PeriodoInicial;
Alegoricamente podemos decir que si A nacio ante que B murioy murio despues que B nacioseguramente vivian alguna epoca juntos..
Blog: http://about.me/GeriReshef Castellano no es mi lengua materna: disculpenme por los errores gramaticales.
-
Hola geovanny,
Perdón por tardar tanto, pero es que en Colombía ayer martes fue día festivo y nadie trabaja los días festivos ^_^ ...
Mil gracias por el ejemplo y mas por el Script SQL que creaste, solo tengo una pequeña duda, exactamente que es lo que se hace con esta linea:
SET @w_valor_inicial=(datepart(year,@periodo_inicial)+datepart(month,@periodo_inicial))
Por que veo que ese parámetro es el que utilizas para hacer la comparación logica !!!
Mil gracias por la respuesta !!!!
Un saludo, Cristian Pérez
-