2013-02-11 74 views
2

我有一個允許用戶生成報告的php腳本,他們可以選擇3個日期範圍。 即3個日期範圍之間的Mysql查詢

2012-01-01 to 2012-01-31 
AND 
2011-01-01 to 2011-01-31 
AND 
2010-01-01 to 2010-01-31 

但是當我做我的查詢,並有一定的日期範圍之間沒有記錄,查詢沒有返回值。

這裏是我的查詢:

SELECT DealerName WHERE InterviewDate >= "2012/01/01 " AND InterviewDate <= " 2012/03/31" 
AND InterviewDate >= "2012/07/01 " AND InterviewDate <= " 2012/09/31" 

我需要一個查詢,如果它是在日期範圍1發現,無論是否有後續的日期範圍內沒有數據,將返回的數據。

將數據彙總到一張表格中,可以在同一個數據上顯示多個日期。

例如:

dealerName 1 2012-01-01 
dealerName 1 2012-02-31 
dealerName 2 2012-03-01 
dealerName 1 2012-06-01 
dealerName 1 2012-06-31 

所以如果我想2012-01-01和2012年2月31日和2012-06-01與2012年6月31日之間查詢數據。我意識到1個日期範圍可能包含所有這些範圍,但用戶可能希望在這兩個日期範圍之間排除數據。

回答

10

面試日期不能在x和y之間,仍然在z和zz之間。你是缺少一個OR - 另外,有一個看BETWEEN操作

SELECT DealerName 
FROM table 
WHERE InterviewDate BETWEEN '2012-01-01' AND '2012-01-31' 
    OR InterviewDate BETWEEN '2011-01-01' AND '2011-01-31' 
    OR InterviewDate BETWEEN '2010-01-01' AND '2010-01-31' 

編輯,對不起,錯過了表名:)

+1

您以錯誤進行查詢。 – 2013-02-11 07:03:52

+1

@HamletHakobyan手指快速換腦,錯過了FROM子句:)謝謝! – hank 2013-02-11 07:05:24

+0

將數據彙總到一個表格中,記錄可能出現在多個日期中。 – user1882752 2013-02-11 07:11:41

4

您需要使用OR代替AND

WHERE (InterviewDate BETWEEN '2012-01-01' AND '2012-01-31') 
     OR 
     (InterviewDate BETWEEN '2011-01-01' AND '2011-01-31') 
     OR 
     (InterviewDate BETWEEN '2010-01-01' AND '2010-01-31') 

更新1

我認爲你有問題Relational Division

SELECT name 
FROM table1 
WHERE DATE BETWEEN '2012-01-01' AND '2012-02-31' 
     OR 
     DATE BETWEEN '2012-06-01' AND '2012-06-31' 
GROUP BY name 
HAVING COUNT(*) = 2 
+0

當然你需要'OR'? – 2013-02-11 07:00:45

+0

不是或取1個範圍或另一個,不是兩個? – user1882752 2013-02-11 07:07:55

+0

我有一個問題給你,可以說你有'2012-01-15'的InterviewDate,怎麼會出現在2011年或2010年? – 2013-02-11 07:13:18

2

使用OR而不是AND

SELECT DealerName FROM tbl 
WHERE InterviewDate >= '2012/01/01' AND InterviewDate <= '2012/03/31' 
OR InterviewDate >= '2012/07/01' AND InterviewDate <= '2012/09/31' 
+0

問題是我需要在所有範圍內查詢數據庫,而不僅僅是一組範圍 – user1882752 2013-02-11 07:08:54

+0

@ user1882752當然,對於所有範圍。該查詢將返回屬於任何範圍的所有行。 – 2013-02-11 07:13:13

4

爲什麼不使用的,而不是AND OR?

SELECT DealerName WHERE (InterviewDate >= "2012/01/01 " AND InterviewDate <= " 2012/03/31") OR (InterviewDate >= "2012/07/01 " AND InterviewDate <= " 2012/09/31") 
1

這是我帶走:)因爲你在month檢查1月爲year 2010,2011,2012。我們可以使用MONTHYEAR函數。

SELECT DealerName 
FROM yourtable 
WHERE Month(InterviewDate) = 1 
AND Year(InterviewDate) IN (2010, 2011, 2012) 
; 

SELECT DealerName 
FROM yourtable 
WHERE Month(InterviewDate) IN (1, 2) // if there are particular months 
AND Year(InterviewDate) IN (2010, 2011, 2012) 
; 
+0

不錯''D''但是這會殺死索引':(' – 2013-02-11 07:13:58

+0

請指教'index'部分。爲什麼你說它會殺死索引?我沒有看到OP在提及'index'列。 – bonCodigo 2013-02-11 07:17:39