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

使用flask_mysqldb向MySQL插入Zulu日期失败,报str_to_date错误

问题解决:MySQL STR_TO_DATE 无法解析带毫秒的ISO格式时间

错误原因

传入的时间字符串2023-01-02T21:00:00.504Z包含毫秒部分.504,但你使用的STR_TO_DATE格式字符串%%Y-%%m-%%dT%%H:%%i:%%sZ仅匹配到秒级,未处理毫秒段,导致解析失败。

解决方案

方案1:修改STR_TO_DATE格式匹配毫秒

调整SQL中的格式字符串,加入%%f(MySQL用于匹配微秒/毫秒的占位符,支持3-6位数字):

sql = '''INSERT into jobs (job_date,cust_auto_id,cost,paid,mileage,job_desc,person_id) values (str_to_date(%s,"%%Y-%%m-%%dT%%H:%%i:%%s.%%fZ"),%s,%s,%s,%s,%s,%s)'''

注:若job_date字段是DATETIME(3)类型(支持存储3位毫秒),此方法可直接保留毫秒信息;若为普通DATETIME,MySQL会自动截断毫秒部分。

方案2:用CAST函数直接转换

如果你的job_date字段支持毫秒存储(DATETIME(3)),可以用更简洁的CAST函数替代STR_TO_DATE:

sql = '''INSERT into jobs (job_date,cust_auto_id,cost,paid,mileage,job_desc,person_id) values (CAST(%s AS DATETIME(3)),%s,%s,%s,%s,%s,%s)'''

方案3:Python端预处理时间字符串

在Python层先解析并格式化时间,再传入SQL:

from datetime import datetime

# 提取时间字符串并处理
job_date_str = request.json.get("jobdate", None)
formatted_date = None
if job_date_str:
    # 解析带Z的ISO格式时间
    dt = datetime.fromisoformat(job_date_str.replace('Z', '+00:00'))
    # 格式化为MySQL兼容的带3位毫秒的字符串
    formatted_date = dt.strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]

# 修改SQL,直接传入格式化后的时间
sql = '''INSERT into jobs (job_date,cust_auto_id,cost,paid,mileage,job_desc,person_id) values (%s,%s,%s,%s,%s,%s,%s)'''
cursor.execute(sql,(formatted_date, request.json.get("whichauto", None), request.json.get("jobcost", None), request.json.get("paystatus", None), request.json.get("mileage", None), request.json.get("jobdesc", None), request.json.get("whichperson", None)))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 10:45:19