【发布时间】:2014-06-26 08:16:31
【问题描述】:
如何将日期列的默认值设置为 UTC 格式的“现在”?我认为答案涉及column element 上的defaultValueComputed 属性。
文档说明:
defaultValueComputed 从函数返回的值或 过程调用。该属性将包含要调用的函数。
引用的函数应该用什么语言编写?爪哇?该函数是否应该是我要使用的数据库供应商特定的日期函数?我可以阅读有关此主题的更多文档吗?
【问题讨论】:
如何将日期列的默认值设置为 UTC 格式的“现在”?我认为答案涉及column element 上的defaultValueComputed 属性。
文档说明:
defaultValueComputed 从函数返回的值或 过程调用。该属性将包含要调用的函数。
引用的函数应该用什么语言编写?爪哇?该函数是否应该是我要使用的数据库供应商特定的日期函数?我可以阅读有关此主题的更多文档吗?
【问题讨论】:
这应该是:
<property name="now" value="now()" dbms="mysql,h2"/>
<property name="now" value="current_timestamp" dbms="postgresql"/>
<property name="now" value="sysdate" dbms="oracle"/>
<property name="now" value="getdate()" dbms="mssql"/>
<changeSet author="me" id="sample_usage_demo">
<addColumn schemaName= "dbo" tableName="demo_table" >
<column name="demo_column" type="datetime" defaultValueDate="${now}">
<constraints nullable="false" />
</column>
</addColumn>
</changeSet>
【讨论】:
这对我有用:
<property name="now" value="UNIX_TIMESTAMP()" dbms="mysql"/>
<column name="ts" type="timestamp" valueDate="${now}"/>
感谢这个答案,我找到了它:https://stackoverflow.com/a/9100388/3107952
【讨论】:
由于 liquibase 是任何数据库的常见变更日志,为了使其通用,您不应依赖任何特定数据库,如 oracle、postegres、mysql,而是应该足够通用以适用于任何/每个数据库。
下面是它的实现方式:
<column name="time" type="${type.datetime}" defaultValueComputed="${column.datetime.defaultValue}"/>
这应该适用于所有数据库,对于 oracle,它将 SYSTIMESTAMP 作为 DATA_DEFAULT 插入。
【讨论】:
在 MySQL 中,要使用像 DATETIME(6)(微秒精度)这样的小数秒的 DATETIME 列,请使用默认值 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)读取。
【讨论】:
这适用于 SQlite:
<column name="last_updated_at" type="TIMESTAMP" defaultValueComputed="CURRENT_TIMESTAMP">
<constraints nullable="false"/>
</column>
添加 '$now' 对我不起作用。我使用 SQlite 作为数据库。
【讨论】:
我使用了数据库供应商的功能。 对于 Oracle,它是 sysdate:
<column name="create_date" type="DATETIME" valueDate="sysdate" defaultValueComputed="sysdate" />
【讨论】:
也许 liquibase 论坛中的this topic 会有所帮助?
我认为defaultValueComputed 将采用数据库特定的功能来表达“现在”。在 mySQL 中,它将是 CURRENT_TIMESTAMP,所以它可能看起来像这样:
<createTable tableName="D_UserSession">
<column name="ts" type="TIMESTAMP" defaultValueComputed="CURRENT_TIMESTAMP"/>
</createTable>
(从论坛帖子复制。)
【讨论】:
defaultValueComputed="to_timestamp('2015-02-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss')" 也适用于 Oracle