2013-02-11 75 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