Ayuda!, soy nuevo manejando sql y necesito orientacio

Tengo la siguiente tabla:
Reserva fecha inicial fecha final
001 agosto 1 2008 agosto 5 2008
002 agosto 6 2008 agosto 10 2008
003 agosto 4 2008 agosto 5 2008
004 septiembre 1 2008 septiembre 10 2008
Las reservas que están en negrita son las que se cruzan es decir, la reserva 003 esta contenida en el rango de fecha de la reserva 001.
La idea es hacer una consulta que me traiga las reservas cruzadas, en este caso si a mi me dicen que traiga las reservas cruzadas entre enero y diciembr, me debería traer solo las que están en negrita porque a pesar de que las demás están contenidas entre enero y diciembre, solo se cruzan la 001 y la 003.
¿Es posible hacerlo solo con transact sql?
De antemano muchas gracias y espero tu colaboración porque apenas inicio en sql server y con lo que se no he podido lograr hacer esto!..
Respuesta
1
Begin Tran
CREATE TABLE #tmp_reservas
(
cod_reserva VARCHAR (5),
fecha_ini DATETIME,
fecha_fin DATETIME
)
INSERT INTO #tmp_reservas
SELECT '001','01/08/2008','05/08/2008'
INSERT INTO #tmp_reservas
SELECT '002','06/08/2008','10/08/2008'
INSERT INTO #tmp_reservas
SELECT '003','04/08/2008','05/08/2008'
INSERT INTO #tmp_reservas
SELECT '004','01/09/2008','05/09/2008'
SELECT *
FROM #tmp_reservas r1
INNER JOIN #tmp_reservas r2
ON r2.fecha_ini BETWEEN r1.fecha_ini AND r1.fecha_fin
AND r2.fecha_fin BETWEEN r1.fecha_ini AND r1.fecha_fin
AND r1.cod_reserva <> r2.cod_reserva
ROLLBACK TRAN
Te dejo un ejemplo para que veas si eso es lo que necesitas o si de esa manera necesitas los datos.
Acá estamos para ayudarte en lo que se pueda, si no se rsolver tus dudas también las puedo investigar y resolverlas juntos.
Suerte con sql es muy potente.
Hola experto, muchísimas gracias por responder tan rapido, la verdad tu ejemplo es muy claro y la actitud que proyectas para ayudar es de todo un profesional. Analizando el ejemplo se acerca muchísimo a la solución que quiero darle a este problema. El punto ahora es que el rango de fechas lo digita el usuario y dentro de ese rango es que voy a buscar las reservas que se cruzan, es decir lo que tu haces en el ejemplo de insertar la fechas y las reservas en la tabla temporal debo manejarlo de una formas más amplia porque en realidad no conozco esos datos, esos datos me los da la consulta que hago dependiendo del rango de fecha que me digitan.
Es algo así: "seleccione reservas cruzadas DONDE las fechas se crucen" en realidad el numero de reserva no es importante, solo lo debo traer como dato informativo, el meollo esta en saber cuales son las fechas que se cruzan. En todo caso el código que me enviaste me da muchas ideas y me voy a poner a estudiarlo enseguida, también sobre tabla temporales que no se mucho.
Espero seguir contando con tu colaboración y muchísimas gracias.
Claro que si, la creación de tabla temporal la hice para hacer la consulta al igual que los datos es como ejemplo unicamente pero si te sirve para solucionar otras cosas que bien.
Hay muchas cosas que puedes hacer con el lenguaje, especialmente con funciones y procedimientos almacenados.
El ejemplo que te envíe lo puedes usar con la tabla real, y elegir los campos que necesites, respecto a la fecha puedes hacer:
SELECT *
FROM #tmp_reservas r1
INNER JOIN #tmp_reservas r2
ON r2.fecha_ini BETWEEN r1.fecha_ini AND r1.fecha_fin
AND r2.fecha_fin BETWEEN r1.fecha_ini AND r1.fecha_fin
AND r1.cod_reserva <> r2.cod_reserva
--- esta es la parte nueva
WHERE r1.fecha_ini >= "fechainicial_seleccionada por usuario"
and r1.fecha_fin <= ''fechafinal_seleccionada_por_usuario"

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas