Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Reto de SQL

Estas en el tema de Reto de SQL en el foro de Mysql en Foros del Web. Muy buenos días , tengo un reto para compartir dado que llevo unas horas dándole a las neuronas y no conectan... El reto es el ...
  #1 (permalink)  
Antiguo 09/03/2010, 06:04
 
Fecha de Ingreso: marzo-2010
Mensajes: 3
Antigüedad: 14 años, 1 mes
Puntos: 0
Reto de SQL

Muy buenos días , tengo un reto para compartir dado que llevo unas horas dándole a las neuronas y no conectan...

El reto es el siguiente :
Tengo una fecha de inicio y una final .
Debo de comprobar si estas fechas se corresponden con alguna existente en la base o si están comprendidas entre ellas.

Ejemplo : Fechainicio 01/12/2010
Fechafinal 31/12/2010

Con la siguiente sentencia

Select *
from Reservas
WHERE '2010/06/13' not in (Select Fechainicio from Reservas)
and '2010/06/13' not between (Select Fechainicio from Reservas where ReservaPagada="f") and (Select Fechafin from Reservas where ReservaPagada="f")
and '2010/11/10' not in (Select Fechafin from Reservas)
and '2010/11/10' not between (Select Fechainicio from Reservas where ReservaPagada="f") and (Select Fechafin from Reservas where ReservaPagada="f")

el problema que me surge es que las sentencias de los between (Select Fechainicio from Reservas where ReservaPagada="f") me devuelven mas de un valor , con lo cual no valida los BETWEEN x AND z
  #2 (permalink)  
Antiguo 09/03/2010, 06:35
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Reto de SQL

Te estás complicando la vida...
Lo que dices es que quieres saber es si hay registros cuyas fechas queden comprendidas entre dos valores dados.
Si quieres saber si las fechas están contenidas dentro del rango, sería:
Código MySQL:
Ver original
  1. SELECT  *
  2. FROM Reservas
  3.     ReservaPagada="f" AND
  4.     ((Fechainicio BETWEEN '2010-06-13' AND '2010-11-10')
  5.     AND
  6.     (Fechafin BETWEEN '2010-06-13' AND '2010-11-10'));
Si quieres saber si están cruzados (inician o terminan fuera del rango), la cosa sería diferente:
Código MySQL:
Ver original
  1. SELECT  *
  2. FROM Reservas
  3.     ReservaPagada="f" AND
  4.     ((Fechainicio < '2010-06-13' AND (Fechafin BETWEEN   '2010-06-13'  AND '2010-11-10'))
  5.     OR
  6.     ((Fechafin BETWEEN '2010-06-13' AND '2010-11-10') AND Fechafin > '2010-11-10'));

Tip:
1) Trata de no hacer subconsultas innecesariamente. En ocasiones lo mismo se obtiene afinando mejor los WHERE o definiendo JOINs con mejor eficiencia, y todo eso es mucho más rápido.
2) Presta atención a los paréntesis para graduar las condiciones y establecer cuáles se deben dar al mismo tiempo, y cuales no.
3) Ten cuidado con el formato de fechas. MySQL es muy estricto.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 09/03/2010, 14:46
 
Fecha de Ingreso: marzo-2010
Mensajes: 3
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Reto de SQL

Buenas , lo primero darte las gracias por tu rapida respuesta , aunque no es lo que buscaba , el problema era que eran varian fechas a comparar entonces la sentencia me devolvia mas de 1 , al final me he metido con vectores y lo he solucionado de otra manera , de todas maneras muchas gracias!

Etiquetas: reto, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:46.