2010-05-18 6 views
2

J'ai 2 bases de données. L'un est properties et l'autre est dates. Dans dates j'ai associé le land_id et une date (en format AAAAMMJJ) ce qui signifie que la date est non disponible.Requête MySQL, plage de dates De "liste noire"

Je dois formuler une requête qu'un utilisateur peut spécifier une date de début et une date de fin, puis choisir une propriété pour laquelle les dates sont disponibles (pas dans la base de données date). Comment les sites Web des compagnies aériennes et des hôtels font-ils ce genre de logique? Je pensais prendre la plage de dates et choisir tous les jours entre et faire une requête où les dates ne correspondent pas et l'ordre par nombre de résultats, mais je peux voir comment cela pourrait facilement se transformer en une requête intense.

CREATE TABLE IF NOT EXISTS `dates` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `land_id` int(11) NOT NULL, 
    `date` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=44 ; 

-- 
-- Dumping data for table `dates` 
-- 

INSERT INTO `dates` (`id`, `land_id`, `date`) VALUES 
(43, 1, '20100526'), 
(39, 1, '20100522'), 
(40, 1, '20100523'), 
(41, 1, '20100521'), 
(42, 1, '20100525'); 
+0

dates de magasin dans les types de données exclusivement conçus pour les dates: 'date' – zerkms

+0

zerkms, merci pour la réponse, mais cela ne répond pas à la logique nécessaire pour tirer les bonnes propriétés? :) – erbaker

+0

désolé d'éditer ma réponse si souvent , je pense que ça devrait aller maintenant ... – Simon

Répondre

2

Avoir les dates que VARCHAR sera plus difficile d'écrire une requête. Je suggère pour enregistrer les dates en tant que DATE et d'utiliser la requête suivante. Cela devrait aider:

SELECT * FROM dates WHERE date NOT BETWEEN '<start_date>' AND '<end_date>' 

Il sélectionne les dates ne se situant entre la plage donnée.

Je trouve une solution dans le MySQL 5.1. reference afin de le faire fonctionner avec VARCHAR aussi:

SELECT STR_TO_DATE(date,'%Y%m%d') as real_date 
FROM dates WHERE real_date NOT BETWEEN '<start_date>' AND '<end_date>' 

Ou

SELECT DATE(date) as real_date 
FROM dates WHERE real_date NOT BETWEEN '<start_date>' AND '<end_date>' 

BTW: <start_date> et <end_date> sont des espaces réservés. Insérez les dates concrètes ici (au format AAAA-MM-JJ).