You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

正确格式下的日期对比及时间区间划分技术求助

嘿,我之前也踩过这种日期对比的大坑,尤其是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:53:22