MySQL查询,日期范围来自“黑名单”

时间:2010-05-18 21:51:05

标签: php mysql web-applications

我有2个数据库。一个是properties,另一个是dates。在dates我已将land_id和日期(以YYYYMMDD格式)相关联,这意味着日期不可用

我需要制定一个查询,用户可以指定开始日期和结束日期,然后选择可用日期的属性(不在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');

1 个答案:

答案 0 :(得分: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)。