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

如何解决1292错误:截断不正确的日期值问题

解决日期转换的1292警告问题

问题根源

你用STR_TO_DATE(ac.created_on, '%Y-%m-%d')处理带时间的字符串时,虽然日期部分格式正确,但MySQL在转换时仍会因为字符串包含额外的时间部分触发截断警告——ALLOW_INVALID_DATES模式仅允许月日处于合理范围(如1-12月、1-31日),无法屏蔽这类截断类警告。

解决方案

  1. 改用DATE()函数直接提取日期
    MySQL的DATE()函数可直接从带时间的字符串中提取日期部分,不会触发截断警告,写法更简洁高效:
SET @t = (
    SELECT COUNT(ac.id)
    FROM table1 ac
    WHERE DATE(ac.created_on)
        BETWEEN (DATE_FORMAT(CURDATE(), '%Y-%m-01') - INTERVAL 1 MONTH)
        AND LAST_DAY(CURDATE() - INTERVAL 1 MONTH)
    AND ac.date = DATE(LAST_DAY(CURDATE() - INTERVAL 1 MONTH))
);
  1. 调整sql_mode关闭严格校验
    如果必须使用STR_TO_DATE,需确保sql_mode中没有STRICT_TRANS_TABLES或STRICT_ALL_TABLES(这类模式会强化数据校验),执行以下语句:
-- 清空会话级sql_mode
SET @@SESSION.sql_mode = '';
-- 或者保留ALLOW_INVALID_DATES并移除严格模式
SET @@SESSION.sql_mode = 'ALLOW_INVALID_DATES';

注意:全局修改需要对应权限,且可能影响其他业务,建议仅做会话级调整。

  1. 前缀匹配优化查询(可选)
    直接对字符串做前缀匹配,无需转换函数,性能更优还能利用字段索引(如果存在):
SET @t = (
    SELECT COUNT(ac.id)
    FROM table1 ac
    WHERE ac.created_on LIKE CONCAT(DATE_FORMAT(CURDATE() - INTERVAL 1 MONTH, '%Y-%m'), '%')
    AND ac.date = DATE(LAST_DAY(CURDATE() - INTERVAL 1 MONTH))
);

内容的提问来源于stack exchange,提问作者Larsiya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 04:12:36