2013-08-23 57 views
0

我处于想要将日期范围与另一个日期范围相匹配的情况,可能很简单,但我坚持使用它。如何检查所选日期范围是否在另一个日期范围

下面是表结构

表 - 生命周期

  • 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 

现在我想按日期范围搜索这些记录,并且想要查看某个生命是否存在于该范围内;例如我想找到2013年8月1日之间的生活 - 2014年1月1日

正如所预期的结果就应该选择生活#2和生活#3

这怎么能与MySQL查询完成?

任何帮助,高度赞赏。

+0

日期是以“VARCHAR”还是“DATE”存储? – hjpotter92

+0

你会在这里找到答案。 http://stackoverflow.com/questions/18395738/find-instructor-free-times-in-mysql-ph/ – Arturs

+0

生命#2和生命#3不在08/01/2013 - 01/01/2014之间.. ...(生命#2在2015年结束!) – NDM

回答

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列上具有的任何可能索引,所以这是不好的。

+0

不起作用!因为我需要找到查询日期范围是否在life_start_date和life_end_date – Alyas

+0

之间比我不确定我明白你在尝试什么。这给了你#2和#3作为结果,因为它们在指定的时间内的某个点上还活着。 – Zagor23

+0

现在就像一个魅力工作! – Alyas

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')) 
+0

你为什么要做这样一个“复杂”的查询... –

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 

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