正确格式下的日期对比及时间区间划分技术求助
嘿,我之前也踩过这种日期对比的大坑,尤其是MySQL里存的是这种非标准的字符串日期,直接对比完全不靠谱!咱们一步步来解决:
首先,核心问题是你存的日期是20/12/17这种字符串格式,MySQL没法直接识别成日期类型,所以你直接转timestamp或者字符串对比都会出错——比如字符串20/12/17看起来比19/01/18大,但实际日期早了一个多月,这就是坑所在。
第一步:把字符串日期转换成MySQL可识别的DATE类型
用STR_TO_DATE()函数,这里你得先确认你的日期格式是YY/MM/DD还是DD/MM/YY:
- 如果是年/月/日(比如2017年12月20日),格式符用
'%y/%m/%d' - 如果是日/月/年(比如2020年12月17日),格式符用
'%d/%m/%y'
举个例子,把数据库里的日期列db_date转成DATE类型:
STR_TO_DATE(db_date, '%y/%m/%d')
第二步:计算日期差值并划分区间
用DATEDIFF()函数计算两个日期的天数差(注意顺序:DATEDIFF(结束日期, 开始日期),得到正数表示结束日期在开始日期之后),再用CASE WHEN划分区间。
如果你的测试报告日期是19/01/18,改成当前日期的话直接用CURDATE()就行,下面是完整的SQL示例:
SELECT db_date, CASE -- 计算报告日期和数据库日期的天数差 WHEN DATEDIFF(STR_TO_DATE('19/01/18', '%y/%m/%d'), STR_TO_DATE(db_date, '%y/%m/%d')) BETWEEN 0 AND 30 THEN '0-30天' WHEN DATEDIFF(STR_TO_DATE('19/01/18', '%y/%m/%d'), STR_TO_DATE(db_date, '%y/%m/%d')) BETWEEN 31 AND 60 THEN '31-60天' WHEN DATEDIFF(STR_TO_DATE('19/01/18', '%y/%m/%d'), STR_TO_DATE(db_date, '%y/%m/%d')) BETWEEN 61 AND 90 THEN '61-90天' WHEN DATEDIFF(STR_TO_DATE('19/01/18', '%y/%m/%d'), STR_TO_DATE(db_date, '%y/%m/%d')) > 90 THEN '91天以上' ELSE '日期异常' -- 处理数据库日期晚于报告日期的情况 END AS date_interval FROM your_table_name;
为什么之前转timestamp遇阻?
很大概率是你转换时用错了日期格式符,导致timestamp转出来是错误的日期,后续对比自然全乱了。用DATE类型+DATEDIFF的方式更直观,也不容易出错。
另外,如果你以后要改成用当前日期,直接把STR_TO_DATE('19/01/18', '%y/%m/%d')换成CURDATE()就可以了,非常方便。
内容的提问来源于stack exchange,提问作者php-b-grader
相关产品推荐
相关产品推荐

