查找年 - 月在指定年 - 月对之间的记录

时间:2016-11-09 11:48:40

标签: mysql sql date

我的数据如下:

image1

我想选择年份和月份介于 11/2015 02/2016 之间的行。我尝试了以下方法:

SELECT * FROM traffic 
WHERE year between '2015' AND '2016'
  AND month between '11' AND '01'
  AND toll_id='14';

但结果不打印。预期输出看起来像this。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:0)

从流量中选择*(年= 2015年和月> = 11)或(年= 2016年和月< = 2)和toll_id =' 14'

答案 1 :(得分:0)

您需要转义列名,因为年份和月份是mysql中的函数。

select *
from traffic
where toll_id = 14 and `month` between 11 and 12 and `year` = 2015 or toll_id = 14 and `month` between 1 and 2 and `year` = 2016 ;

甚至更好地使用datetime字段(确认该列名为“created_at”):

select *
from traffic
where toll_id = 14 and month(created_at) between 11 and 12 and year(created_at) = 2015 or toll_id = 14 and month(created_at) between 1 and 2 and year(created_at) = 2016;

同时注意包含什么以及在使用之间排除什么。最后一个可能被排除在外。

编辑:由于问题中的定义更改,我也改变了答案。现在你在where子句中有两个完全不同的条件。您需要再次完整条件来检查2016年的1和2,因为or打破了您的整个条件。 如果不这样做,您会看到更多未公开的结果。我在mysql数据库上成功测试了datetime查询。因此,另一个查询也有效,因为条件相同

答案 2 :(得分:0)

这是一个解决方案:

-- The (Y1, M1) pair must be less than or equal to (Y2, M2)

SET @Y1 = 2014;
SET @M1 = 11;
SET @Y2 = 2016;
SET @M2 = 1;

SELECT *
FROM traffic
WHERE
    toll_id = 14 
    AND @Y1 <= `year` AND `year` <= @Y2 
    AND NOT (
        (@Y1 = `year` AND `month` < @M1) OR
        (@Y2 = `year` AND `month` > @M2)
    )

它只返回年份在所需范围内的行减去年份与开始年份相同但月份小于开始月份或年份的行与结束年份相同但月份更大比结束月份。

SQL Fiddle