3个日期范围之间的Mysql查询
Posted
技术标签:
【中文标题】3个日期范围之间的Mysql查询【英文标题】:Mysql query between 3 date ranges 【发布时间】:2013-02-11 06:57:59 【问题描述】:我有一个允许用户生成报告的 php 脚本,他们可以选择 3 个日期范围。 即
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"
我需要一个查询,如果在其中一个日期范围内找到数据,则无论后续日期范围内是否没有数据,它都会返回数据。
数据被汇总到一个表格中,同一数据可能出现在多个日期。
例如:
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-02-31 AND 2012-06-01 AND 2012-06-31 之间的数据。我意识到 1 个日期范围可以包含所有这些范围,但用户可能希望排除这两个日期范围之间的数据。
【问题讨论】:
【参考方案1】:面试日期不能介于 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'
编辑,对不起,错过了表名:)
【讨论】:
@HamletHakobyan 手指快速大脑,错过了 FROM 子句 :) 谢谢! 数据汇总到一个表格中,记录可能出现在多个日期。 @user1882752 一个单行不能在多个范围之间,因为它们不重叠。假设你穿了一件红衬衫。哪个论述是对的? “你有一件红色衬衫和一件绿色衬衫和一件蓝色衬衫”或“你有一件红色衬衫或一件绿色衬衫或一件蓝色衬衫”? @hank 谢谢,这行得通。 (因为没有看到明显的东西,我已经多次拍自己的脸)【参考方案2】:为什么不使用 OR 而不是 AND ?
SELECT DealerName WHERE ( InterviewDate >= "2012/01/01 " AND InterviewDate <= " 2012/03/31" ) OR ( InterviewDate >= "2012/07/01 " AND InterviewDate <= " 2012/09/31" )
【讨论】:
【参考方案3】:您需要使用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
SQLFiddle Demo
SQL of Relational Division
【讨论】:
不会占用 1 个范围或另一个,而不是两者? 我有一个问题要问你,假设你有一个InterviewDate
或2012-01-15
,它怎么会出现在2011
或2010
的年份?
我认为括号是多余的。
@HamletHakobyan 是的,但这是为了清楚起见。无论如何它不会影响性能。
@JW,我已经编辑了关于数据如何重复的说明【参考方案4】:
使用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'
【讨论】:
问题是我需要查询所有范围的数据库,而不仅仅是一组范围 @user1882752 当然,对于所有范围。此查询将返回属于任何范围的所有行。【参考方案5】:这是我的收获 :) 因为您正在检查 1 月的 month
是否有 year
2010、2011、2012。我们可以使用 MONTH
和 YEAR
函数。
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)
;
【讨论】:
请在index
部分启发我。为什么说它会杀死索引?我没有看到 OP 提到了 index
列。以上是关于3个日期范围之间的Mysql查询的主要内容,如果未能解决你的问题,请参考以下文章
使用未在 Mysql 中排序的多个日期范围查询给定月份的日期范围间隙