1,在項目實際應用中需要查詢上個月整月的數據,因為之前的項目中有類似的查詢。所以使用了STR_TO_DATE函數來當作條件。結果發現使用出錯了。錯誤用法:
SELECT COUNT(1) FROM tf_u_user WHERE CREATE_TIME >= STR_TO_DATE('2019-04','%Y-%m') AND CREATE_TIME < STR_TO_DATE('2019-05', '%Y-%m');
此方法使用的問題在於 STR_TO_DATE() 這個函數,格式化日期的時候不會只格式化到年月,會格式化年月日,比如 STR_TO_DATE('2019-04','%Y-%m') 等同於 ‘2019-03-31’。所以出現了錯誤。
select STR_TO_DATE('2019-04','%Y-%m'); --- “2019-03-31”
使用此查詢語句發現和預期結果不一樣,因此使用了另一種方法。
SELECT * FROM tf_u_user WHERE PERIOD_DIFF(date_format(NOW(),'%Y%m' ) , date_format(CREATE_TIME,'%Y%m')) =1;
優化和補充:
使用此方法解決了STR_TO_DATE()函數的坑,但是只能查詢上個月的數據,那如果相查上上個月怎么辦,再早一點數據則么辦?
可以修改 =1 為=2 等。
當然這個只是一種方法。不是最好的。但是在實際使用中有效果,同時想記錄下這個坑。為此作為提醒。使用任何函數的時候都要測試下。不能依靠經驗。
另外這個錯誤是自己對STR_TO_DATE這個函數理解不夠,使用方法不得當,如果是寫成年月日也是可以的。
SELECT COUNT(1) FROM tf_u_user WHERE CREATE_TIME >= STR_TO_DATE('2019-04-01','%Y-%m-%d') AND CREATE_TIME < STR_TO_DATE('2019-05-01', '%Y-%m-%d');
這樣寫也是可以查詢4月的數據的。可以根據實際應用具體選擇。