You need to enable JavaScript to run this app. Python实现mm/dd/yyyy转yyyy-mm-dd格式及CSV导入MySQL日期字段为空解决
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 03:54:02