使用date_format(str_to_date())插入日期至datetime列报错求助
解决MySQL插入2018年周日到datetime列的问题
咱们先一步步拆解你遇到的问题,找到核心坑点:
1. 去掉多余的子查询包裹
你的测试查询本身是正确的,但插入语句里完全没必要把日期转换函数包在SELECT子查询里——直接写函数表达式就行。比如把:
(select date_format(str_to_date("January 14 2018","%M %d %Y"),"%Y-%m-%d %I:%i"))
改成:
date_format(str_to_date("January 14 2018","%M %d %Y"),"%Y-%m-%d %H:%i:%s")
这里把%I(12小时制)换成%H(24小时制),同时补全秒的部分%s,因为MySQL的datetime类型标准格式是YYYY-MM-DD HH:MM:SS,避免因格式不完整触发报错。
2. 别用'0000-00-00 00:00:00'当无效日期
如果你的end字段是datetime类型,在MySQL的严格模式(比如sql_mode包含NO_ZERO_DATE)下,'0000-00-00 00:00:00'是不允许的。建议换成NULL,或者如果需要表示周日的结束时间,可以写成当天的23:59:59,比如:
date_format(str_to_date("January 14 2018","%M %d %Y"),"%Y-%m-%d 23:59:59")
3. 修改后的单条插入语句示例
调整后的正确插入语句应该是这样的:
INSERT INTO `events` (`id`, `title`, `color`, `start`, `end`) VALUES (NULL, 'Sunday', '#FFE761', date_format(str_to_date("January 14 2018","%M %d %Y"),"%Y-%m-%d 00:00:00"), date_format(str_to_date("January 14 2018","%M %d %Y"),"%Y-%m-%d 23:59:59"));
4. 批量插入更高效(适合所有周日)
既然你已经有了2018年所有周日的日期列表,不如直接批量插入,不用逐条写:
INSERT INTO `events` (`title`, `color`, `start`, `end`) VALUES ('Sunday', '#FFE761', date_format(str_to_date("January 07 2018","%M %d %Y"),"%Y-%m-%d 00:00:00"), date_format(str_to_date("January 07 2018","%M %d %Y"),"%Y-%m-%d 23:59:59")), ('Sunday', '#FFE761', date_format(str_to_date("January 14 2018","%M %d %Y"),"%Y-%m-%d 00:00:00"), date_format(str_to_date("January 14 2018","%M %d %Y"),"%Y-%m-%d 23:59:59")), -- 这里继续添加其他周日的记录 ('Sunday', '#FFE761', date_format(str_to_date("December 30 2018","%M %d %Y"),"%Y-%m-%d 00:00:00"), date_format(str_to_date("December 30 2018","%M %d %Y"),"%Y-%m-%d 23:59:59"));
如果你的日期列表是现成的,还可以用Python/Shell脚本自动生成这些插入行,省得手动敲。
5. 排查剩余问题的小技巧
如果还是报错,试试这几步:
- 单独执行日期转换函数,确认输出格式完全匹配
start字段的datetime类型; - 执行
SHOW ERRORS;获取具体错误信息,比如是格式不匹配、字段类型不对还是权限问题; - 检查
id字段是否是自增主键——如果是,VALUES里的NULL没问题;如果不是,得指定合法的id值。
内容的提问来源于stack exchange,提问作者sukebe7
相关产品推荐
相关产品推荐

