This is a cache of http://dbflute.seasar.org/ja/manual/function/generator/task/replaceschema/dateadjustment.html. It is a snapshot of the page at 2024-11-01T00:21:30.066+0000.
相対的な日付調整 (DateAdjustment) | DBFlute

相対的な日付調整 (DateAdjustment)

概要

ReplaceSchemaのテストデータ登録で、日付データを相対的に動かして登録できます。@since 1.0.4A

気付いたらテストデータが古い問題対応

テストデータは、日が経つにつれて徐々に古いデータになってきます。検索にヒットしていたデータがある日突然ヒットしなくなることもあります。 一週間以内に会員登録された会員というデータを作っても、一週間経てばいなくなってしまいます。これは開発期間が長ければ長いほど顕著です。

ReplaceSchemaで登録するテストデータも、放っておけばどんどん古くなります。 そのテストデータが最適だった日(基準日)から現在日付までの相対日数を足した上で登録することで、常に今の時点からの距離を一定に保つことができます。

設定ファイル

データファイルと同じディレクトリに loadingControlMap.dataprop という名前のテキストファイルを配置して、dateAdjustmentMapプロパティを定義して日付調整の細かい指定をします。

e.g. データ登録の制御のプロパティ設定 @loadingControlMap.dataprop
map:{
    ...

    # dateAdjustmentMap = map:{
    #     ; df:originDate = 2013/03/09
    #     ; $$ALL$$ = map:{
    #         ; $$ALL$$ = addDay($distance)
    #     }
    #     ; MEMBER = map:{ BIRTHDATE = addDay(0) }
    # }
    ; dateAdjustmentMap = map:{
        ; df:originDate = 2008/01/01
        ; $$ALL$$ = map:{
            ; $$ALL$$ = addDay($distance)
            ; FORMALIZED_DATETIME = addDay(0)
            ; LOGIN_DATETIME = addDay(0)
        }
        ; MEMBER = map:{ BIRTHDATE = addDay(0) }
        ; MEMBER_ADDRESS = map:{ $$ALL$$ = addDay(0) }
        ; WHITE_XLS_MAN = map:{ $$ALL$$ = addDay(0) }
    }
}

とあるカラムの日付データを一律 7 日進めてDBに登録する、というようなことができますし、また、全てのカラムの日付データと一律調整というようなこともできます。 どのカラムをどのように調整するか、細かく設定できます。

この機能は、エクセル、TSV、CSVの形式で利用できます。

日付調整スクリプト

テーブル名とカラム名を指定し、その値として日付調整スクリプトを指定します。

e.g. 会員の生年月日に 7 日を足して登録する @loadingControlMap.dataprop
map:{
    ...
    ; dateAdjustmentMap = map:{
        ; MEMBER = map:{ BIRTHDATE = addDay(7) }
    }
}

テーブル名やカラム名に $$ALL$$ を指定すると、全てのテーブル、全ての日付カラムという指定ができます。 テストデータの日付を一律移動させたいような場合に有効です。 (厳密には、このdatapropファイルが配置されているディレクトリのデータファイルの全てのテーブルとなります)

e.g. 会員の全ての日付カラムに 7 日を足して登録する @loadingControlMap.dataprop
map:{
    ...
    ; dateAdjustmentMap = map:{
        ; MEMBER = map:{ $$ALL$$ = addDay(7) }
    }
}
e.g. 全てのテーブルの全ての日付カラムに 7 日を足して登録する @loadingControlMap.dataprop
map:{
    ...
    ; dateAdjustmentMap = map:{
        ; $$ALL$$ = map:{ $$ALL$$ = addDay(7) }
    }
}

名称指定と$$ALL$$を併用して両方にヒットする場合は、名称指定の方が優先されます。 例えば、全ての日付カラムを日付調整するが、とあるカラムだけは何もしない、という指定もできます。

e.g. 全ての日付カラムに 7 日を足すが、会員の生年月日は何もしない @loadingControlMap.dataprop
map:{
    ...
    ; dateAdjustmentMap = map:{
        ; $$ALL$$ = map:{ $$ALL$$ = addDay(7) }
        ; MEMBER = map:{ BIRTHDATE = addDay(0) }
    }
}

調整スクリプトは、例えば以下のような表現が使えます。

addYear(int)
指定された数の分、年を足す
addMonth(int)
指定された数の分、月を足す
addDay(int)
指定された数の分、日を足す
addHour(int)
指定された数の分、時間を足す
moveToDayJust()
その日のジャスト(時分秒なし)に移動
moveToDayTerminal()
その日の最後(23:59:59.999)に移動
moveToMonthJust()
その月のジャスト(1日の時分秒なし)に移動
moveToMonthTerminal()
その月の最後(月末日の23:59:59.999)に移動

add系のメソッドの引数に、マイナス値を入れた場合は、日付が過去に移動します。

これらは、"." (ドット)つなぎで複数指定することもできます。

e.g. 会員の生年月日に 7 日を足して、その日のジャスト(時分秒なし)に @loadingControlMap.dataprop
map:{
    ...
    ; dateAdjustmentMap = map:{
        ; MEMBER = map:{ BIRTHDATE = addDay(7).moveToDayJust() }
    }
}

実は、DBFluteランタイムの HandyDate を呼び出しているだけです。HandyDate のメソッドがこのプロパティの中で表現できる限り利用可能です。

DBFluteランタイム - HandyDate

基準日から今日までの日数を足す

固定の日数ではなく、とある基準日から今日(ReplaceSchema実行日)までの日数や月数などで調整することができます。 テーブル名の指定部分に df:originDate というキーで基準日を指定すると、調整スクリプトの中で現在日時までの日数などを指定することができます。

e.g. 基準日(originDate)を2008年11日にして、全てのカラム移動 @loadingControlMap.dataprop
map:{
    ...
    ; dateAdjustmentMap = map:{
        ; df:originDate = 2008/01/01
        ; $$ALL$$ = map:{ $$ALL$$ = addDay($distance) }
    }
}

調整スクリプト内の日数は、以下のように表現できます。

$distance
addDay()なら日数、addMonth()なら月数、addYear()なら年数
$distanceYears
addYear()以外で年数を利用する場合に利用
$distanceMonths
addMonth()以外で月数を利用する場合に利用
$distanceDays
addDay()以外で日数を利用する場合に利用

基準日に、そのテストデータが最適だった日(作成された日)を指定し、全ての日付カラムにその計算された日数を足せば、最適だった状態がそのまま日が経っても引き継がれます。 もちろん、固定の日付のままにしておきたいカラムがある場合は、そのカラムは名称指定で addDay(0) としておけばそのままのデータで登録されます。

アプリで現在日時を調整できるように仕組みがあれば、それを使うこともできますが、その仕組みは結合テストやシナリオテストなどで利用するものであれば、 日々の開発のローカルでのテストで使うのは現実的ではありません(いちいち面倒かと)。 この日付調整の機能を使って、常に決まったタイミングのデータが保たれるようにしておくといいでしょう。

その他、細かい仕様

デフォルトsysdateのカラムは対象外

defaultValueMap.datapropにて sysdate が指定されていて、それが有効になるケースでは、その sysdate が優先され、現在日時がそのまま登録されます。

また、エクセルデータで既に $sysdate.addDay(...) 形式で相対値の指定がされている場合は、その指定が優先されます。

DBには調整後のデータが登録される

当然のことですが、DBには調整後のデータが登録されます。 つまり、LoadDataReverseなどでデータを抽出した場合は、調整後のデータが出力されるため、調整前の情報は残っていません。

ミリ秒を格納した日付型にも対応 @since 1.0.5C

DB上のデータ型は日付ではなく、単なる BIGINT でミリ秒を格納するような日付データでも、日付調整が利用できます(@since 1.0.5C)

通常の BIGINT のカラムと区別するために、カラム名を指定する必要があります。 dateAdjustmentMap の直下の要素として、df:millisColumnList を追加してカラム名を指定します。

e.g. 名前が _MILLIS で終わるカラムも日付調整対象にする @loadingControlMap.dataprop
map:{
    ...

    # dateAdjustmentMap = map:{
    #     ; df:originDate = 2013/03/09
    #     ; $$ALL$$ = map:{
    #         ; $$ALL$$ = addDay($distance)
    #     }
    #     ; MEMBER = map:{ BIRTHDATE = addDay(0) }
    # }
    ; dateAdjustmentMap = map:{
        ; df:originDate = 2008/01/01
        ; ; df:millisColumnList = list:{
            ; suffix:_MILLIS
        }
        ; $$ALL$$ = map:{
            ; $$ALL$$ = addDay($distance)
        }
    }
}

エクセル上において、ミリ秒ではなく日付表現(yyyy/MM/dd)でも解釈されるようになります。