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)FROMtf_u_userWHERECREATE_TIME>= STR_TO_DATE('2019-04-01','%Y-%m-%d')ANDCREATE_TIME< STR_TO_DATE('2019-05-01', '%Y-%m-%d');
这样写也是可以查询4月的数据的。可以根据实际应用具体选择。