Dynamics365 日付項目のインポートで値がずれる問題
みなさん、こんにちは。
今回は、Dynamics365を導入中のお客様のところで発生した、日付項目に関する事象について、その原因と解決策についてご紹介します。また、2月も終わりに差し掛かっておりますが、ちょうど「この時期」にまつわるネタでもあります。
発生現象の確認
以下は営業案件のビューです。ここに、日付項目「推定クローズ日」が出ています。
この日付項目の値を、Excelインポートで更新したが、Excelに記載した日付の値と1日ずれてしまったという連絡を、お客様から受けました。
「日付が1日ずれる」と聞くと、TimeZoneが悪さをしているのではないかと思いながら、実際にインポートを試してみました。しかし、素朴にインポートで日付を設定するだけでは、事象は再現しませんでした。
さらに詳しく話を聞くと、お客様の中では「1900/1/1」という日付を、特別な値として設定されたいようで(「未設定」のようなニュアンスで使われるそうです)この日付を設定しようとする時だけ1日ずれるということでした。
そこで、「1900/1/1」を含めた、いくつかの日付で、インポート時の動作を試してみました。
先ほどのビューから、データをExcelにエクスポートします。
エクスポートしたExcelファイル上で、いくつか、年代の違う1月1日を設定してみます。
このExcelファイルをインポートした結果が下記です。
確かに、「1900/1/1」を設定しようとしたレコードだけが、その1日前の「1899/12/31」となり、それ以外のレコードは、設定どおりの年の1月1日になりました。
設定する値によって、ずれるかずれないか、結果が変わるようです。
そこでさらに細かく、この事象が発生する日付の条件を調べていったところ、1900年の1月~2月では事象が発生するが、1900年の3月以降では発生しないということがわかりました。
閏年についてのおさらい
この事象ですが、結論としては、原因は「閏年」に関係するものでした。具体的には、「1900年」という年に対して、これが「閏年であるかどうか?」の判定が問題となっていました。
そこで、まず、基礎知識ですが、ある西暦年が閏年になる条件をおさらいしましょう。
※2月が28日までしかない年を「平年」、2月が29日まである年を「閏年」と呼びます。
(1) 4の倍数でない年は、平年である。
(2) 4の倍数の年は、閏年となる。
(2-1)ただし、100の倍数の年は、平年になる。
(2-1-1)ただし、400の倍数の年は、閏年となる。
基本的に、2020年とか2024年のように、「4の倍数」の年が閏年となりますが、100の倍数(下2桁が「00」)の場合は要注意です。
2100年とか2200年は、4の倍数ではありますが、例外的に平年となります。
また、2000年とか2400年のように、400の倍数(下2桁が「00」で、かつ上の2桁が4の倍数)のときは、100の倍数のグループの中でもさらに例外的に、閏年となります。
1900年は閏年か?
上記を踏まえますと、1900年というのは、「100の倍数であるが400の倍数でない」ので、平年となるのが正しいです。
しかし、実は、Dynamicsとしては1900年を平年と認識している(正しい)のに、Excelは閏年と認識しています(間違い)。
参考ページ:Excel では、1900年がうるう年であると誤って想定しています
https://docs.microsoft.com/ja-jp/office/troubleshoot/excel/wrongly-assumes-1900-is-leap-year
試しに、Dynamicsのフォーム画面上に配置された日付項目で、カレンダーを見ながら日付を設定してみましょう。
1900年2月のカレンダーは、2月が28日までになっているので、平年扱いです。(正しい)
一方、Excel上で、適当なセルに「1900年2月20日」などと打ち込んでから、オートフィルで3月までの連続する値を入れてみましょう。
すると、2月28日と3月1日の間に2月29日が設定されるので、Excelでは閏年と認識している(誤り!)ことがわかります。
この現象が原因となって、Excel上で「1900年2月以前」の値を入力してDynamicsにインポートすると、想定より1日ずれてしまうとのことです。
なお本件の顛末としては、Excel側の問題は対処するのが難しいことと、1900年という限定的な設定値のみで発生することから、お客様側で運用で回避することになりました(1900/1/1を設定したいときだけ、Excelに記入する日付を1日ずらす)。
このように、Dynamics365は、他のいろいろなMicrosoft製品との連携を売りにしている都合上、トラブルの調査を行った結果、他の製品の問題に行き着くこともある訳です。