UPDATE语句中日期字符串必须加单引号,否则Oracle等会报错,MySQL可能隐式转为整数导致存错;DATETIME用'2023-01-01 14:30:00',DATE用'2023-01-01',Oracle推荐TO_DATE显式转换,且格式码大小写敏感、mm需写为mi,字段类型为VARCHAR时不可直接赋DATE值,MySQL 5.7+默认拒绝'0000-00-00'需改数据或配置sql_mode。

UPDATE语句中日期字符串没加单引号
这是最常被忽略的语法错误,尤其在手写SQL或拼接动态SQL时。Oracle、PostgreSQL、Kingbase等数据库会把2023-01-01当作数学表达式(2023减1减1),直接报错;MySQL可能隐式转成整数,结果存成2021这种非法值。
正确写法必须用单引号包裹:'2023-01-01',且格式需与字段类型兼容:
- DATETIME/TIMESTAMP字段:用
'2023-01-01 14:30:00' - DATE字段:用
'2023-01-01' - Oracle中若字段是
DATE类型,建议显式用TO_DATE('2023-01-01', 'YYYY-MM-DD'),避免会话级NLS_DATE_FORMAT干扰
TO_CHAR或TO_DATE参数格式代码写错
Oracle和Kingbase里TO_DATE和TO_CHAR的格式代码大小写敏感且有固定含义,写错就会报ORA-01810或ORA-01821。
典型错误:
-
'yyyy-MM-dd HH24:mm:ss'——mm是月份,分钟必须用mi,应改为'yyyy-MM-dd HH24:mi:ss' -
'YYYY-MM-DD HH24:MM:SS'—— 大写MM仍是月份,分钟仍需MI -
HH(12小时制)和HH24(24小时制)混用,导致hour must be between 1 and 12报错
验证方式:先单独执行SELECT TO_DATE('2023-01-01 14:30:00', 'yyyy-mm-dd hh24:mi:ss') FROM dual;看是否成功。
字段是VARCHAR但UPDATE时当DATE用
如果start_date字段类型是VARCHAR,却在UPDATE里直接赋值TO_DATE(...)或CURRENT_DATE,MySQL会尝试隐式转换——失败则报Incorrect datetime value,成功则存成字符串'2023-01-01',但后续MIN()、BETWEEN等操作全按字典序跑偏。
修复路径分两步:
- 查真实类型:
DESCRIBE table_name或SHOW COLUMNS FROM table_name LIKE 'start_date' - 临时补救:
UPDATE table_name SET start_date = DATE_FORMAT(NOW(), '%Y-%m-%d') WHERE ...(MySQL)或TO_CHAR(CURRENT_DATE, 'YYYY-MM-DD')(Oracle)保证写入合法字符串 - 长期方案:改字段类型:
ALTER TABLE table_name MODIFY start_date DATE(MySQL)或ALTER TABLE table_name ALTER COLUMN start_date TYPE DATE USING start_date::DATE(PostgreSQL)
MySQL 5.7+因sql_mode拒绝零日期
执行UPDATE ... SET created_at = '0000-00-00'在MySQL 5.7及以上版本必报Incorrect date value,因为默认启用NO_ZERO_DATE和NO_ZERO_IN_DATE模式。
不能靠SET SESSION sql_mode绕过——应用连接重启后失效,且多数ORM不继承该设置。
真正可用的解法只有两个:
- 改数据:用
'1000-01-01'或CURRENT_DATE替代'0000-00-00' - 改配置:在
/etc/my.cnf的[mysqld]段加sql_mode = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION",然后sudo systemctl restart mysql
注意:改配置后所有新连接生效,但已有连接仍用旧模式,必须重启服务才彻底生效。
日期字段类型、格式字符串、sql_mode三者只要一个不匹配,UPDATE就可能静默失败或写入脏数据。最稳妥的做法是:先DESCRIBE确认字段类型,再用TO_DATE/STR_TO_DATE显式转换,最后用SELECT验证写入结果是否可被正确解析。

















