SQL选择查询以选择日期之间的数据,其中日期月份高于日期月份和年份差异> 1

时间:2014-09-05 06:35:12

标签: mysql sql date

我想从查询参数的表格中选择所有记录:

from_month:09

to_month:03

从2011年开始

to_year:2014

我正在尝试以下查询:

Select * from Table 
where month(created_at) between '09' and '03' 
     and year(created_at) between '2011' and '2014' 

虽然数据在那里但它返回零记录,因为from_month大于月份。

我甚至尝试过查询来直接比较日期而不是月份和年份,但它仍然会返回零记录。

2 个答案:

答案 0 :(得分:0)

你可以尝试一下吗?我想你是这样做的。

之间达到最小值
where month(created_at) between '09' and '03' 

而不是

where month(created_at) between '03' and '09' 

或使用大于和小于

的方式
SELECT * FROM tbl WHERE month(created_at)>='09' AND month(created_at)<='11'

答案 1 :(得分:0)

您的查询失败有两个原因。首先,between首先需要有下限,然后是上限。因此,beween 9 and 3将始终为您提供0条记录 其次,它会遗漏例如'2012-01-01''2012-02-28'之间的记录以及'2012-10-01''2013-02-28'之间的记录。

不要让事情变得更复杂。

SELECT * FROM table1
WHERE created_at BETWEEN '2011-09-01' AND '2014-03-31'

这样做也更好,因为MySQL不能在应用函数的列上使用索引。

如果您不知道,如果上一天的日期是30日,31日,28日甚至29日,您可以这样做:

SELECT * FROM table1
WHERE created_at BETWEEN '2011-09-01' AND LAST_DAY('2014-03-01');

另请注意,当created_at列的类型为timestamp或datetime时,您必须附加时间。否则你将错过最后一天的记录。

SELECT * FROM table1
WHERE created_at BETWEEN '2011-09-01' AND '2014-03-31 23:59:59'

如果您没有追加时间,它会自动变为00:00:00,因此您会错过2014-03-31