Python实现mm/dd/yyyy转yyyy-mm-dd格式及CSV导入MySQL日期字段为空解决
日期导入为NULL的根因与修复方案
核心问题定位
- 传入SQL的
start_datetime、end_datetime是原始的mm/dd/yyyy hh:mm:ss AM格式,MySQL的DATETIME类型仅识别yyyy-mm-dd hh:mm:ss结构的合法格式,对带斜杠、AM/PM后缀的字符串会直接解析失败,写入NULL,且不会抛出阻断性错误提示,极易被忽略。 - 代码存在逻辑漏洞:拆分日期字符串时连续两次给临时变量
tmp赋值,第一次拆分start_date得到的结果被后续拆分end_date的结果直接覆盖,后续拼接日期时完全无法取到正确的开始日期;且手动拼接的iso_date仅包含日期部分,没有搭配时分秒,即便格式能被MySQL识别也缺少时间维度的数值。 - 转换逻辑缺失:没有对12小时制的AM/PM标识做24小时制转换,即便字符串结构拼对,上午、下午的时间偏差也会导致存储的时间不符合预期。
可直接套用的修复步骤
- 优先使用Python标准库
datetime的内置方法做时间格式转换,不要手动拆分字符串拼接,降低出错概率。首先导入依赖:
from datetime import datetime
- 替换原有冗余的字符串拆分逻辑,按指定格式解析、转换时间:
# 对应原始CSV内的日期格式:mm/dd/yyyy hh:mm:ss AM/PM original_fmt = "%m/%d/%Y %I:%M:%S %p" # 对应MySQL可识别的标准日期时间格式 mysql_fmt = "%Y-%m-%d %H:%M:%S" # 转换开始/结束时间为MySQL兼容格式 start_dt = datetime.strptime(start_datetime, original_fmt).strftime(mysql_fmt) end_dt = datetime.strptime(end_datetime, original_fmt).strftime(mysql_fmt)
- 修正原有的SQL写法,弃用高风险的字符串直接拼接,改用参数化查询,同时传入处理好的标准格式时间:
sql_local = """INSERT INTO customer_1.pay_and_display (plate, machine_id, ticket_datetime, expiry_datetime, ticket_name, ticket_price) VALUES (%s, %s, %s, %s, %s, %s) """ cursor.execute(sql_local, ( vrm, location_id, start_dt, end_dt, "IPSWL", SessionCost ))
- 修正原有异常打印的语法错误:原代码
print "Error with row: " % row没有在字符串中预留格式化占位符,报错时无法输出正确的行内容,替换为:
print(f"Error with row: {row}")
新手避坑提示
- 批量导入数据前,先单条测试最终拼接的SQL语句输出值,确认日期格式符合MySQL要求后再全量执行,避免整批数据写入后才发现NULL值问题。
- 所有涉及时间解析的场景,统一使用标准库的格式化方法处理,手动拆分字符串的写法很难覆盖12/24小时切换、前导零缺失、大小写错配等边缘场景。
内容的提问来源于stack exchange,提问作者preethi
相关产品推荐
相关产品推荐

