2013-08-23 482 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 

因此,根據結果您可以檢查日期是否在現有的日期範圍之間。