如何以UTC格式将日期列的默认值设置为“now”?我认为答案涉及column element上的defaultValueComputed
属性。
文档说明:
defaultValueComputed从函数或函数返回的值 程序调用。该属性将包含要调用的函数。
应该写入的函数是什么语言? Java的?该函数应该是我想要使用的数据库供应商特定的日期函数吗?我还可以阅读有关此主题的更多文档吗?
答案 0 :(得分:25)
liquibase论坛中的this topic也许有帮助吗?
我认为defaultValueComputed
将采用数据库特定功能来表达"现在"。在mySQL中它将是CURRENT_TIMESTAMP
所以它看起来像这样:
<createTable tableName="D_UserSession">
<column name="ts" type="TIMESTAMP" defaultValueComputed="CURRENT_TIMESTAMP"/>
</createTable>
(从论坛帖子复制。)
答案 1 :(得分:3)
在MySQL中,要使用DATETIME列,其中小数为秒,如DATETIME(6)
(微秒精度),请使用默认值NOW(6)
(警告:CURRENT_TIMESTAMP(6)
由于某种原因会产生错误我用liquibase 3.5.3):
<column name="created_at" type="DATETIME(6)" defaultValueComputed="NOW(6)" >
<constraints nullable="false" />
</column>
请注意,该值将以UTC内部存储,但使用服务器的时区设置(@@global.time_zone
,@@session.time_zone
)进行读取。
答案 2 :(得分:2)
这适用于SQlite:
<column name="last_updated_at" type="TIMESTAMP" defaultValueComputed="CURRENT_TIMESTAMP">
<constraints nullable="false"/>
</column>
添加'$ now'对我不起作用。我使用SQlite作为数据库。
答案 3 :(得分:1)
由于liquibase是任何数据库的常见更改日志,为了使其通用,您不应该依赖任何特定的数据库,如oracle,postegres,mysql,而应该是通用的,足以适用于任何/每个数据库。
以下是如何实施的:
<column name="time" type="${type.datetime}" defaultValueComputed="${column.datetime.defaultValue}"/>
这适用于所有数据库,对于oracle,它将SYSTIMESTAMP作为DATA_DEFAULT插入。
答案 4 :(得分:0)
我使用了数据库供应商的功能。 对于Oracle来说,它是 sysdate :
<column name="create_date" type="DATETIME" valueDate="sysdate" defaultValueComputed="sysdate" />