日付列のデフォルト値をUTC形式で「現在」に設定するにはどうすればよいですか?答えは、 列要素 のdefaultValueComputed
属性に関係すると思います。
ドキュメントの状態:
defaultValueComputed関数またはプロシージャ呼び出しから返される値。この属性には、呼び出す関数が含まれます。
参照される関数は、どの言語で記述されることになっていますか? Java?関数は、使用するデータベースベンダー固有の日付関数であると想定されていますか?このトピックで読むことができるドキュメントは他にありますか?
たぶん このトピック liquibaseフォーラムで役立ちますか?
defaultValueComputed
は、「今」を表現するためにデータベース固有の関数を取ると思います。 mySQLではCURRENT_TIMESTAMP
したがって、次のようになります。
<createTable tableName="D_UserSession">
<column name="ts" type="TIMESTAMP" defaultValueComputed="CURRENT_TIMESTAMP"/>
</createTable>
(フォーラムの投稿からコピー。)
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」を追加しても機能しませんでした。 DBとしてSQliteを使用しています。
Liquibaseはすべてのデータベースの一般的な変更ログであるため、汎用化するには、Oracle、postegres、mysqlなどの特定のデータベースに依存しないでください。
以下に実装方法を示します。
<column name="time" type="${type.datetime}" defaultValueComputed="${column.datetime.defaultValue}"/>
これはすべてのデータベースで機能するはずです。Oracleの場合、SYSTIMESTAMPをDATA_DEFAULTとして挿入します。
これは私のために働いた:
<property name="now" value="UNIX_TIMESTAMP()" dbms="mysql"/>
<column name="ts" type="timestamp" valueDate="${now}"/>
私はこの答えのおかげでそれを見つけました: https://stackoverflow.com/a/9100388/3107952
データベースベンダーの関数を使用しました。 Oracleの場合は、sysdate:
<column name="create_date" type="DATETIME" valueDate="sysdate" defaultValueComputed="sysdate" />