2010-05-18 52 views
2

我有2個數據庫。一個是properties,另一個是dates。在dates我已關聯land_id和日期(以YYYYMMDD格式),這意味着日期是不可用MySQL查詢,來自「黑名單」的日期範圍

我需要制定一個查詢,用戶可以指定開始日期和結束日期,然後選擇可用日期的屬性(不在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 2010-05-18 22:02:16

+0

zerkms,謝謝你的回覆,但是這並沒有解決拉動正確屬性所需的邏輯?:) – erbaker 2010-05-18 22:08:44

+0

抱歉我經常編輯我的答案,我認爲現在應該可以...... – Simon 2010-05-18 22:08:48

回答

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>' 

BTW:<start_date><end_date>是佔位符。在那裏插入具體日期(格式爲YYYY-MM-DD)。