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

SQL日期插入异常:无1997日期值却触发Date_Issued字段错误

问题排查与解决

错误根源

你生成的SQL语句里,日期值没有被单引号包裹,MySQL会把2023-01-25当成算术表达式计算:2023 - 1 - 25 = 1997,这个数值无法转换为合法的DATE类型,所以触发了"Incorrect date value: '1997'"的错误。

看你调试器里的SQL:

INSERT INTO Librarian.Issues(Title, Date_Issued, Date_Due, Doc_id) VALUES("Return of the King",2023-01-25,2023-02-08, 3);

这里2023-01-25和2023-02-08没有引号,MySQL自动执行减法运算,得到的1997自然不符合DATE列的要求。

修复方案

方案1:给日期值添加单引号

修改SQL生成的代码,将issuedate和returndate用单引号包裹:

def insertIssue(self, choice, doc_id):
    date = datetime.today() + timedelta(days=14)
    returndate = str(date.strftime('%Y-%m-%d'))
    issuedate = str(datetime.today().strftime('%Y-%m-%d'))
    # 给日期值加上单引号
    sql = dbcfg.sql['insertIssues'].replace('{_ttl}', f'"{choice[2]}"').replace('{_date}', f"'{issuedate}'").replace(
        '{_due}', f"'{returndate}'").replace("{_docid}", str(doc_id))
    logger.info("Issues SQL Insert: " + sql)
    try:
        mycursor.execute(sql)
        # 插入操作不需要fetchall(),直接移除
        # 提交事务确保数据写入
        self._cnx.commit()
    except Exception as e:
        logger.error("Error in Issues SQL: " + str(e) + traceback.format_exc())
        sys.exit(-1)

修改后生成的SQL会变成:

INSERT INTO Librarian.Issues(Title, Date_Issued, Date_Due, Doc_id) VALUES("Return of the King",'2023-01-25','2023-02-08', 3);

这样MySQL会正确识别日期字符串。

方案2:使用参数化查询(推荐)

字符串拼接/替换生成SQL存在SQL注入风险,也容易出现这类格式错误,更安全的方式是用参数化查询:
假设你的dbcfg.sql['insertIssues']定义为:

INSERT INTO Librarian.Issues(Title, Date_Issued, Date_Due, Doc_id) VALUES(%s, %s, %s, %s);

然后修改代码:

def insertIssue(self, choice, doc_id):
    date = datetime.today() + timedelta(days=14)
    returndate = str(date.strftime('%Y-%m-%d'))
    issuedate = str(datetime.today().strftime('%Y-%m-%d'))
    sql = dbcfg.sql['insertIssues']
    # 使用参数化传递值
    params = (choice[2], issuedate, returndate, doc_id)
    logger.info("Issues SQL Insert: " + sql + " | Params: " + str(params))
    try:
        mycursor.execute(sql, params)
        self._cnx.commit()
    except Exception as e:
        logger.error("Error in Issues SQL: " + str(e) + traceback.format_exc())
        sys.exit(-1)

参数化查询会自动处理字符串、日期等类型的格式问题,同时避免SQL注入。

额外注意点

  • 插入操作执行后必须调用commit()提交事务,否则数据不会写入数据库。
  • fetchall()用于查询操作获取结果,插入操作不需要调用,可直接移除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 13:20:33