【问题标题】:MySQL Query, Date Range From "Blacklist"MySQL 查询,来自“黑名单”的日期范围
【发布时间】:2011-02-21 03:05:58
【问题描述】:

我有 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');

【问题讨论】:

  • 以专门为日期设计的数据类型存储日期:date
  • zerkms,感谢您的回复,但这并没有解决提取正确属性所需的逻辑?:)
  • 很抱歉这么频繁地编辑我的答案,我想现在应该可以了...

标签: php mysql web-applications


【解决方案1】:

将日期设为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>'

顺便说一句:&lt;start_date&gt;&lt;end_date&gt; 是占位符。在此处插入具体日期(格式为 YYYY-MM-DD)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-07
    • 2011-01-01
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多