mysql 使用函數STR_TO_DATE()踩過的坑


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月的數據的。可以根據實際應用具體選擇。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM