对于如下一张交易流水的样表,我们如何去筛选一段时期内(本月,上个月,前三个月。。。)的交易流水记录呢?
本月记录查询
首先我们需要限定月份和当前月份相等,如下所示:
SELECT * FROM timetest WHERE month(time)=(month(NOW()));
则会连同其它年份相同月份的记录一起查询。
所以,必须限定年份也和当前年份相等才可以。如下:
SELECT * FROM timetest WHERE year(time)=year(NOW()) and month(time)=(month(NOW()));
前几个月记录查询
假若查询的是前三个月的交易流水,结合date_sub()函数,很容易写出如下代码:
select * from timetest where year(time)=year(NOW()) and month(time)!=month(NOW()) and time>=date_sub(now(),INTERVAL 3 month)
查询结果:
可以看出,查询结果是正确的。
但是,此查询办法却有一个bug,即假如当前月份为二月份,则用该查询查前三个月的交易流水显而易见是错误的。
解决办法当然可以是加个判断,但却不利于推广使用。
更好的办法即是使用between 函数:
SELECT * FROM timetest WHERE month(time)!=month(NOW()) and (time BETWEEN (date_sub(NOW(),interval 3 month)) and NOW());
查询结果:
至此,我们可以很方便的查询前任意几个月的交易流水:
#上个月 前三个月 十个月
SELECT * FROM timetest WHERE month(time)!=month(NOW()) and (time BETWEEN (date_sub(NOW(),interval 1 month)) and NOW());
SELECT * FROM timetest WHERE month(time)!=month(NOW()) and (time BETWEEN (date_sub(NOW(),interval 3 month)) and NOW());
SELECT * FROM timetest WHERE month(time)!=month(NOW()) and (time BETWEEN (date_sub(NOW(),interval 10 month)) and NOW());
查询结果: