如何检查所选日期范围是否在另一个日期范围之间

时间:2013-08-23 12:30:39

标签: mysql sql date

我处于我希望将日期范围与其他日期范围匹配的情况,它可能很简单,但我坚持下去。

下面是表格结构

表格 - 生命周期

  • life_id
  • life_start_date
  • life_end_date

然后有几条记录如下

1 - 07/23/2013 - 07/24/2013
2 - 07/15/2013 - 07/25/2015
3 - 03/10/2013 - 03/10/2014

现在我想按日期范围搜索这些记录,并希望查看该范围内是否存在某些生命;例如我想找到08/01/2013 - 01/01/2014之间的生活

根据预期的结果,它应该选择生命#2和生命#3

如何使用MySQL查询完成此操作?

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

此查询应该这样做:

SELECT 
    *
FROM
    lifecycles
WHERE
    str_to_date(life_start_date, '%m/%d/%Y') <= '2014-01-01' 
    AND str_to_date(life_end_date, '%m/%d/%Y') >= '2013-08-01';

这基本上意味着在你想要的范围结束之前生命还没有开始,生命并没有在范围开始之前结束。

由于您以VARCHAR格式保留日期,因此您需要使用str_to_date函数,这是不好的,因为MySQL将无法利用您在start_date或end_date列上的任何可能的索引。

答案 1 :(得分:1)

这可能会对你有帮助。

SELECT SUM( IF( '2014-01-02' BETWEEN from_date AND to_date, 1, 0 ) ) AS from_exist,
       SUM( IF( '2014-02-12' BETWEEN from_date AND to_date, 1, 0 ) ) AS to_exist
FROM date_range

因此,根据结果,您可以检查日期是否在现有日期范围之间。

答案 2 :(得分:0)

因此,您希望排除在08/01/2013之前结束的生命以及在01/01/2014之后未启动的生命。这应该有效:

SELECT *
  FROM lifecycles as alive
 WHERE NOT EXISTS (
       SELECT 1
         FROM lifecycles as dead
        WHERE dead.life_id = alive.life_id
          AND (str_to_date(life_start_date, '%m/%d/%Y') > '2014-01-01'
           OR str_to_date(life_end_date, '%m/%d/%Y') < '2013-08-01'))