如何防止MySQL中的时间戳四舍五入



我有一个问题,一个名为updated_at的字段,用户可以自由选择要存储的日期,如果用户发送2021-08-11T21:59:59.999Z,它将自动四舍五入为2021-08-11 22:00:00.0,所以该字段看起来像这个

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "updated_at")
private Date updatedAt;

我读到将timestamp更改为timestamp(3)将解决舍入问题,所以我编写了一个Liquibase脚本,如此changeset

<changeSet id="10" author="autho2">
<modifyDataType
columnName="updated_at"
newDataType="timestamp(3)"
tableName="user_data"/>
</changeSet>

然而,我得到错误:

liquibase.exception.DatabaseException: 
Invalid default value for 'updated_at' [Failed SQL:
(1067) ALTER TABLE user_data MODIFY updated_at timestamp(3)]

我做错了什么,还是错误地将日期转换为实例?

修改列定义时,必须包含要保留的所有属性:

ALTER TABLE user_data
MODIFY updated_at timestamp(3) 
NULL                           -- if you you want it NULLable
DEFAULT CURRENT_TIMESTAMP(3)   -- note this needs "(3)" too
ON UPDATE CURRENT_TIMESTAMP(3) -- if you want

补充Rick James的回答:(Rick的SQL工作起来很有魅力(

要将其与Liquibase一起使用,您可以尝试使用:

1. <changeSet id="10" author="autho2">
<sql>
ALTER TABLE user_data
MODIFY updated_at timestamp(3) 
NULL                           -- if you you want it NULLable
DEFAULT CURRENT_TIMESTAMP(3)   -- note this needs "(3)" too
ON UPDATE CURRENT_TIMESTAMP(3); -- if you want
<sql>
</changeSet>
2. <changeSet id="10" author="autho2">
<modifyDataType
columnName="updated_at"
newDataType="timestamp(3)"
tableName="user_data"/>
<modifySql>  
<append  value="NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)"/>
</modifySql>
</changeSet>

在运行liquibase update之前,您可以尝试使用liquibase updateSQL并检查输出SQL(如果是要运行的预期SQL(。

相关内容

  • 没有找到相关文章

最新更新