
在使用 Beego ORM 执行原始 SQL 更新操作时,若直接传入 time.Now() 作为 TIMESTAMP 类型字段的值,MySQL 可能因格式不匹配(如仅传入 '15:46:59')而报错“Incorrect datetime value”。解决方法是显式将时间格式化为 MySQL 兼容的 "2006-01-02 15:04:05" 字符串。
在使用 beego orm 执行原始 sql 更新操作时,若直接传入 `time.now()` 作为 `timestamp` 类型字段的值,mysql 可能因格式不匹配(如仅传入 `'15:46:59'`)而报错“incorrect datetime value”。解决方法是显式将时间格式化为 mysql 兼容的 `"2006-01-02 15:04:05"` 字符串。
MySQL 的 TIMESTAMP 和 DATETIME 类型要求输入值必须符合标准日期时间格式(如 "2006-01-02 15:04:05"),而 Go 的 time.Time 类型在通过 o.Raw().Exec() 传递给 MySQL 时,不会自动转换为字符串;Beego ORM 的参数绑定机制对 time.Time 的处理依赖于底层驱动行为,某些场景下可能仅序列化为时间部分(如 '15:46:59'),导致 MySQL 拒绝插入或更新。
✅ 正确做法是:手动调用 .Format() 方法,指定 MySQL 兼容的时间格式:
const MySQLTimeFormat = "2006-01-02 15:04:05"
nowStr := time.Now().Format(MySQLTimeFormat)
num, err := o.Raw(
"UPDATE apply_leave SET leavestatus = ?, resultdate = ? WHERE leaveid = ?",
leaveResult.LeaveResult,
nowStr,
leave_id,
).Exec()
if err != nil {
// 处理错误,例如 log.Printf("update failed: %v", err)
return err
}
? 注意事项:
- Go 的时间格式化使用固定参考时间
Mon Jan 2 15:04:05 MST 2006(即 Unix 时间戳1136239445),因此"2006-01-02 15:04:05"是唯一正确的 MySQL 标准格式模板,不可写成"Y-m-d H:i:s"等 PHP 风格。 - 若数据库字段为
TIMESTAMP且设置了DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,也可考虑省略该字段更新,改由 MySQL 自动维护,从而避免应用层格式风险。 - 更健壮的替代方案是使用 Beego ORM 的结构体更新(如
o.Update(&model)),它会自动处理time.Time字段的序列化,前提是模型中已正确定义resultdate字段类型并启用auto_now或auto_now_add标签。
? 总结:原始 SQL 中涉及时间字段时,切勿直接传递 time.Time 值;务必显式格式化为 "2006-01-02 15:04:05" 字符串——这是 Go 与 MySQL 时间交互中最常见也最关键的兼容性实践。











