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 originalCREATE TABLE `reservas` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`bici` text,
`fechainicio` DATE DEFAULT NULL,
`fechafinal` DATE DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;
--
-- Volcar la base de datos para la tabla `reservas`
--
INSERT INTO `reservas` VALUES(4, 'BT250', '2011-09-01', '2011-09-03');
INSERT INTO `reservas` VALUES(3, 'BT250', '2011-09-03', '2011-09-03');
INSERT INTO `reservas` VALUES(2, 'BT250', '2011-08-30', '2011-08-31');
INSERT INTO `reservas` VALUES(1, 'BT250', '2011-08-30', '2011-09-01');
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 originalSELECT * 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 originalSELECT * FROM reservas
WHERE
bici='BT250'
AND
fechainicio NOT BETWEEN '2011-08-31' AND '2011-08-31'
AND
fechafinal NOT BETWEEN '2011-08-31' AND '2011-08-31';
Gracias