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月的数据的。可以根据实际应用具体选择。

猜你喜欢

转载自www.cnblogs.com/xuyd1108/p/10953033.html