Ver Mensaje Individual
  #7 (permalink)  
Antiguo 02/09/2011, 12:32
josecastro
 
Fecha de Ingreso: agosto-2009
Mensajes: 8
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Rango de fechas seleccionar inverso

Gracias por los aportes, me explicaré mejor.
El problema radica cuando se seleccionan fechas intermedias.
Lo he logrado solucionar con un monstruo de php pero ahora me ha picado el orgullo e intento conseguir la solución en SQL, si no se encuentra otra solución publicaré el de php

Tengo está gráfica que muestra mejor:


id=Numero de la bici
bici=Es el modelo de la bici (puede tener varias bicis del mismo modelo)
fechainicio=Fecha inicio reserva
fechafinal=Fecha final de la reserva

NO TENGO los valores intermedios

El SQL es:
Código SQL:
Ver original
  1. CREATE TABLE `reservas` (
  2.   `id` INT(11) NOT NULL AUTO_INCREMENT,
  3.   `bici` text,
  4.   `fechainicio` DATE DEFAULT NULL,
  5.   `fechafinal` DATE DEFAULT NULL,
  6.   PRIMARY KEY (`id`)
  7. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;
  8.  
  9. --
  10. -- Volcar la base de datos para la tabla `reservas`
  11. --
  12.  
  13. INSERT INTO `reservas` VALUES(4, 'BT250', '2011-09-01', '2011-09-03');
  14. INSERT INTO `reservas` VALUES(3, 'BT250', '2011-09-03', '2011-09-03');
  15. INSERT INTO `reservas` VALUES(2, 'BT250', '2011-08-30', '2011-08-31');
  16. INSERT INTO `reservas` VALUES(1, 'BT250', '2011-08-30', '2011-09-01');
  17. INSERT INTO `reservas` VALUES(5, 'BT300', NULL, NULL);

Mi pregunta es como buscar una bici modelo BT250 que no esté reservada el 2011-08-31 (La unica solucion son la id=3 y el id=4)

La he probado con esta solucion que me dio jurena y me devuelve las bicis BT250 1,3 y la 4
Código SQL:
Ver original
  1. SELECT * FROM reservas WHERE bici= 'BT250' AND id NOT IN (SELECT id FROM reservas  WHERE fechainicio >= '2011-08-31' AND fechafinal <= '2011-08-31')

Y con esta otra solución de gnzsoloyo me devuelve la 1, 3 y la 4
Código SQL:
Ver original
  1. SELECT * FROM reservas
  2. WHERE
  3. bici='BT250'
  4. AND
  5. fechainicio NOT BETWEEN '2011-08-31' AND '2011-08-31'
  6. AND
  7. fechafinal NOT BETWEEN '2011-08-31' AND '2011-08-31';

Gracias