文章目錄
對於如下一張交易流水的樣表,我們如何去篩選一段時期內(本月,上個月,前三個月。。。)的交易流水記錄呢?
本月記錄查詢首先我們需要限定月份和當前月份相等,如下所示:
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());
查詢結果:
查詢前幾天的流水記錄也可以用該方法。不再贅言。