2010-05-18 2 views
2

У меня есть 2 базы данных. Один из них - properties, а другой - dates. В dates Я связал land_id и дату (в формате YYYYMMDD), что означает, что дата не доступно.MySQL Query, Date Range From «Черный список»

Мне нужно сформулировать запрос, который пользователь может указать дату начала и окончания, а затем выбрать свойство, для которого доступны даты (не в базе данных date). Как авиакомпании и гостиничные сайты делают такую ​​логику? Я думал о том, чтобы выбрать диапазон дат и собирать все дни между ними и делать запрос, когда даты не совпадают и упорядочиваются по количеству результатов, но я вижу, как это может легко превратиться в интенсивный запрос.

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

даты хранения в типах данных, специально предназначенных для дат: 'date' – zerkms

+0

zerkms, спасибо за ответ, но это не касается логики, требуемой для того, чтобы вытащить правильные свойства? :) – erbaker

+0

извините за редактирование моего ответа так часто , я думаю, теперь все должно быть хорошо ... – Simon

ответ

2

Имея даты как VARCHAR затруднит написать запрос. Я предлагаю , чтобы сохранить даты как DATE и воспользуйтесь следующим запросом. Это должно помочь:

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

Он выбирает дата не находится между заданным диапазоном.

Я нашел решение в MySQL 5.1. reference для того, чтобы заставить его работать с VARCHAR тоже:

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

Или

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

КСТАТИ: <start_date> и <end_date> заполнители. Вставьте конкретные даты там (в формате ГГГГ-ММ-ДД).