使用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
相关产品推荐
相关产品推荐

