Liquibase:如何将日期列的默认值设置为UTC格式的“now”?

时间:2014-05-08 18:53:22

标签: sql liquibase

如何以UTC格式将日期列的默认值设置为“now”?我认为答案涉及column element上的defaultValueComputed属性。

文档说明:

  

defaultValueComputed从函数或函数返回的值   程序调用。该属性将包含要调用的函数。

应该写入的函数是什么语言? Java的?该函数应该是我想要使用的数据库供应商特定的日期函数吗?我还可以阅读有关此主题的更多文档吗?

5 个答案:

答案 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" />