Consulta

19/12/2008 - 11:00 por David | Informe spam
Muy buenas,

Microsoft SQL Server 2000

Escenario:
Tabla: [id],[desde],[hasta]

Campos [desde] y [hasta] almacenan fechas

¿Cómo montar una consulta que al pasarle un rango de fechas @inicio y @fin
devuelva los días que pertenencen al rango definido [desde] / [hasta]?

me explico:
en la tabla almaceno los siguientes rangos:

[desde] [hasta]
07/01/09 07/01/09
10/01/09 20/01/09


La consulta debería responder a la pregunta ¿Cuántos días "comparte" el
periodo por ejemplo del 06/01/09 al 12/01/09?

El resultado esperado:
1
3

el periodo introducido 06/01/09 al 12/01/09 para el primer registro comparte
1 día (el día 07/01/09)
el periodo introducido 06/01/09 al 12/01/09 para el segundo registro
comparten 3 días (el 10, 11 y el 12)

De antemano, muchísimas gracias.

Nota: ni idea por donde meterle mano.
 

Leer las respuestas

#1 Jose TH
19/12/2008 - 14:04 | Informe spam
Una idea ( si lo entendí bien):

Es como buscar la intersección de dos intervalos.

Ejemplo para un registro particular vas a encontrar la intersección entre el
intervalo de los parámetros, ejemplo @p1 y @p2 (primer intervalo) con el
intervalo de las columnas del registro, @f1 y @f2 (el segundo intervalo),
luego trata de implementar una formula:

1) Saca la fecha mínima entre @f2 y @p2 (los extremos derechos de cada
intervalo) (Case When...)
2) Saca la fecha máxima entre @f1 y @p1 (los extremos izquierdos de cada
intervalo) (Case.. When..)
3) Resta la fecha obtenida en (2) de la obtenida en (1) para calcular la
cantidad de dias (DateDiff) y sumale 1 dia.

DateDiff (day, MaximaFecha(@f1, @p1), MinimaFecha(@f2, @p2) + 1

4) Compara el resultado de (3) con Cero y devuelve el Maximo (para descartar
los negativos).

MaximoNumero(0, DateDiff (day, MaximaFecha(@f1, @p1),
MinimaFecha(@f2, @p2) + 1 )

Nota: esas funciones de Maximos y Minimos horizontales las puedes
implementar con Case, When.. preferible en udf's. Tambien quizas una udf
"DiasCompartidos" a la cual le mandes los 4 parametros:

select desde, hasta, dbo.DiasCompartidos(@p1, @p2, desde, hasta) as
DiasCompartidos
from tabla where

Si no es asi, pon mas ejemplos...



"David" escribió en el mensaje
news:
Muy buenas,

Microsoft SQL Server 2000

Escenario:
Tabla: [id],[desde],[hasta]

Campos [desde] y [hasta] almacenan fechas

¿Cómo montar una consulta que al pasarle un rango de fechas @inicio y @fin
devuelva los días que pertenencen al rango definido [desde] / [hasta]?

me explico:
en la tabla almaceno los siguientes rangos:

[desde] [hasta]
07/01/09 07/01/09
10/01/09 20/01/09


La consulta debería responder a la pregunta ¿Cuántos días "comparte" el
periodo por ejemplo del 06/01/09 al 12/01/09?

El resultado esperado:
1
3

el periodo introducido 06/01/09 al 12/01/09 para el primer registro
comparte 1 día (el día 07/01/09)
el periodo introducido 06/01/09 al 12/01/09 para el segundo registro
comparten 3 días (el 10, 11 y el 12)

De antemano, muchísimas gracias.

Nota: ni idea por donde meterle mano.


Preguntas similares