【问题标题】:Mysql date range query returning wrong set of resultsMysql日期范围查询返回错误的结果集
【发布时间】:2016-09-26 03:39:24
【问题描述】:

这里是查询:

SELECT `mainevents`.`maineventid`   AS `MainEventID`, 
       `mainevents`.`maineventcode` AS `MainEventCode`, 
       `mainevents`.`datestart`     AS `DateStart`, 
       `mainevents`.`dateend`       AS `DateEnd`, 
       `mainevents`.`location`      AS `Location`, 
       `mainevents`.`name`          AS `Name` 
FROM   `mainevents`, 
       `mainevents_lookup` 
WHERE  `mainevents`.`maineventid` = `mainevents_lookup`.`maineventid` 
       AND `mainevents`.`categoryid` = 1 
       AND ( ( `mainevents_lookup`.`datestart` >= '2016-02-27 00:00:00' 
               AND `mainevents_lookup`.`datestart` <= '2016-05-27 11:59:59' ) 
              OR ( `mainevents_lookup`.`dateend` >= '2016-02-27 00:00:00' 
                   AND `mainevents_lookup`.`dateend` <= '2016-05-27 11:59:59' ) 
              OR ( `mainevents_lookup`.`dateend` <= '2016-05-27 11:59:59' 
                   AND `mainevents_lookup`.`datestart` >= '2016-02-27 00:00:00' 
                 ) ) 
LIMIT  0, 30 

它正在尝试查找日期在所选两个日期范围内的列表。 DateStart 是 '2016-02-27 00:00:00' 而 DateEnd 是 '2016-05-27 11:59:59'

由于某种原因,它不断给我想要找到的相反结果。我知道答案就在眼前,谁能帮帮我?

【问题讨论】:

  • 你为什么不使用BETWEEN 还向我们展示了当前的样本数据和预期结果。请阅读How-to-Ask 这里是START 了解如何提高问题质量并获得更好答案的好地方。
  • @Dave 这看起来应该是一个答案,因此您可以正确格式化它。

标签: php mysql date select join


【解决方案1】:

我应该完成默认设置并验证初始数据。表中的数据不正确,查询正确地提取了未来事件,因为查找表中的日期范围在查询的日期范围内。

【讨论】:

    【解决方案2】:

    不应需要第二个 OR 条件,并且看起来最后一个 AND 测试使用了错误的列(datestart 而不是 dateend)。

    AND ( ( `mainevents_lookup`.`datestart` >= '2016-02-27 00:00:00' 
               AND `mainevents_lookup`.`datestart` <= '2016-05-27 11:59:59' ) 
              OR ( `mainevents_lookup`.`dateend` >= '2016-02-27 00:00:00' 
                   AND `mainevents_lookup`.`dateend` <= '2016-05-27 11:59:59' ) 
    ) 
    

    【讨论】:

      【解决方案3】:

      检查重叠的日期范围(StartA <= EndB) and (EndA >= StartB)

      SELECT `mainevents`.`maineventid`   AS `MainEventID`, 
             `mainevents`.`maineventcode` AS `MainEventCode`, 
             `mainevents`.`datestart`     AS `DateStart`, 
             `mainevents`.`dateend`       AS `DateEnd`, 
             `mainevents`.`location`      AS `Location`, 
             `mainevents`.`name`          AS `Name` 
      FROM   `mainevents`, 
             `mainevents_lookup` 
      WHERE  `mainevents`.`maineventid` = `mainevents_lookup`.`maineventid` 
        AND `mainevents`.`categoryid` = 1 
        AND `mainevents_lookup`.`datestart` <= '2016-05-27 11:59:59'     
        AND `mainevents_lookup`.`dateend` >= '2016-02-27 00:00:00'
      LIMIT  0, 30 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-28
        • 1970-01-01
        • 2014-04-12
        • 1970-01-01
        • 1970-01-01
        • 2013-11-07
        • 2021-06-26
        相关资源
        最近更新 更多