[DBMoto]数値型フィールドに入っている日時形式のデータを日時型フィールドにレプリケーションするには


DBMotoのレプリケーションにおいて、お客様から以下のようなご質問をいただくことがあります。

レプリケーションの元となるデータベースで、数値型のフィールドに”20151118”といった形式で日付データが用意されています。
このデータをレプリケーション先にある日付型フィールドに適切な形に変換したいのですが、可能でしょうか。

これに対しての答えですが、DBMoto標準機能であるスクリプト機能を利用すれば変換可能です。

今回は、グローバルスクリプトに設定した関数を個別のレプリケーション(リフレッシュ・ミラーリング)のマッピングにて呼び出す方法を案内いたします。
※VBのスクリプトです。
※この記事を読み進めるためには、まずは以下の弊社ブログ記事をお読みいただきますよう、お願いいたします。
関数を使用してレプリケーション時のデータを変換する方法

■1:
グローバルスクリプトのウィンドウを開き、GlobalScriptクラスに以下のコードを挿入します。そのまま保存します。

        Public Shared Function CONVERTNUMBERTODATE (objDate as Object) as Object             
         If objDate Is Nothing OrElse objDate Is System.DBNull.Value Then
               CONVERTNUMBERTODATE = System.DBNull.Value
         Else 
               CONVERTNUMBERTODATE = new DateTime(Left(objDate.ToString(),4) , Mid(objDate.ToString(),5,2), Right(objDate.ToString(),2))
         End if
        End Function

■2:
各レプリケーションのプロパティから、マッピング画面を開き、対象のマッピングを右クリックして「関数へのマッピング」を選択します。

■3:
CONVERTNUMBERTODATE関数を入力します。
例:CONVERTNUMBERTODATE([DATETIME])

convertnumbertodate

■4:
OKを押せば設定完了です。念のため正常に動作するか確認してください。


なお、この逆に、日時型フィールドのデータを数値型フィールドに日時形式で挿入させることも可能です。
以下のCONVERTDATETONUMBER関数を同じ手順で設定します。
※シンクロナイゼーション時の場合はサポートフォームよりお問い合わせください。

        Public Shared Function CONVERTDATETONUMBER(objDate as Object) as Object
         Dim dtDate as DateTime              
         If objDate Is Nothing OrElse objDate Is System.DBNull.Value Then
               CONVERTDATETONUMBER = System.DBNull.Value
         Else 
               dtDate = objDate
               CONVERTDATETONUMBER = dtDate.Year * 10000 + dtDate.Month * 100 + dtDate.Day           
         End if
        End Function       

関連したトピックス

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください