web-dev-qa-db-ja.com

Liquibase:日付列のデフォルト値をUTC形式で「現在」に設定する方法

日付列のデフォルト値をUTC形式で「現在」に設定するにはどうすればよいですか?答えは、 列要素defaultValueComputed属性に関係すると思います。

ドキュメントの状態:

defaultValueComputed関数またはプロシージャ呼び出しから返される値。この属性には、呼び出す関数が含まれます。

参照される関数は、どの言語で記述されることになっていますか? Java?関数は、使用するデータベースベンダー固有の日付関数であると想定されていますか?このトピックで読むことができるドキュメントは他にありますか?

27
Jeff

たぶん このトピック liquibaseフォーラムで役立ちますか?

defaultValueComputedは、「今」を表現するためにデータベース固有の関数を取ると思います。 mySQLではCURRENT_TIMESTAMPしたがって、次のようになります。

<createTable tableName="D_UserSession">
    <column name="ts" type="TIMESTAMP" defaultValueComputed="CURRENT_TIMESTAMP"/>
</createTable>

(フォーラムの投稿からコピー。)

25
Jens

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
Pavel S.

これはSQliteで動作します:

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

「$ now」を追加しても機能しませんでした。 DBとしてSQliteを使用しています。

2
Neha

Liquibaseはすべてのデータベースの一般的な変更ログであるため、汎用化するには、Oracle、postegres、mysqlなどの特定のデータベースに依存しないでください。

以下に実装方法を示します。

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

これはすべてのデータベースで機能するはずです。Oracleの場合、SYSTIMESTAMPをDATA_DEFAULTとして挿入します。

1
Sagar Jani

これは私のために働いた:

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

私はこの答えのおかげでそれを見つけました: https://stackoverflow.com/a/9100388/3107952

0
Pedro Madrid

データベースベンダーの関数を使用しました。 Oracleの場合は、sysdate

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