【问题标题】:Liquibase: How to set the default value of a date column to be "now" in UTC format?Liquibase:如何将日期列的默认值设置为 UTC 格式的“现在”?
【发布时间】:2014-06-26 08:16:31
【问题描述】:

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

文档说明:

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

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

【问题讨论】:

    标签: sql liquibase


    【解决方案1】:

    这应该是:

    <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>
    

    【讨论】:

      【解决方案2】:

      这对我有用:

      <property name="now" value="UNIX_TIMESTAMP()" dbms="mysql"/>
      <column name="ts" type="timestamp" valueDate="${now}"/>
      

      感谢这个答案,我找到了它:https://stackoverflow.com/a/9100388/3107952

      【讨论】:

      • 嘿佩德罗,也许你可以接受人们建议的编辑。您有人说 ${now} 不起作用,但那是因为您忽略了人们需要为他们支持的每个数据库定义“现在”的事实:
      【解决方案3】:

      由于 liquibase 是任何数据库的常见变更日志,为了使其通用,您不应依赖任何特定数据库,如 oracle、postegres、mysql,而是应该足够通用以适用于任何/每个数据库。

      下面是它的实现方式:

      <column name="time" type="${type.datetime}" defaultValueComputed="${column.datetime.defaultValue}"/>
      

      这应该适用于所有数据库,对于 oracle,它将 SYSTIMESTAMP 作为 DATA_DEFAULT 插入。

      【讨论】:

      • 不幸的是,它对我使用 postgreSQL 不起作用
      • 这些表达从何而来?对我来说,这只是默默地失败了。
      • 这个答案不完整
      【解决方案4】:

      在 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)读取。

      【讨论】:

        【解决方案5】:

        这适用于 SQlite:

        <column name="last_updated_at" type="TIMESTAMP" defaultValueComputed="CURRENT_TIMESTAMP">
                        <constraints nullable="false"/>
        </column>
        

        添加 '$now' 对我不起作用。我使用 SQlite 作为数据库。

        【讨论】:

          【解决方案6】:

          我使用了数据库供应商的功能。 对于 Oracle,它是 sysdate

          <column name="create_date" type="DATETIME" valueDate="sysdate" defaultValueComputed="sysdate" />
          

          【讨论】:

            【解决方案7】:

            也许 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
            • 注意:这只会将默认值设置为 CURRENT_TIMESTAMP,而不是在更新时将值(如 last_updated_at)更改为 CURRENT_TIMESTAMP,与 mysql 和 mariadb 的行为相同
            猜你喜欢
            • 2019-05-15
            • 2020-07-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-02-19
            • 2016-10-26
            • 1970-01-01
            • 2017-11-26
            相关资源
            最近更新 更多