質問: 小数の扱いについてご教授ください。 以下のレコードのvalueはSQL Serverのfloat(倍精度小数)です。 valueは他のシステムでもつ単精度小数の値がSQL ServerのテーブルにINSERTされます。 diffは30分前の値との差分です。 本来diffはすべて30になるべきなのですが、一箇所だけ29があります。 それがなぜなのかご教授いただきたいです。 説明不足かもしれませんが、どうかよろしくお願いします。 *Datetime,value,diff* 2017/12/4 8:00 398278.59375 **30.09375** 2017/12/4 8:30 398308.59375 **30.00000** **2017/12/4 9:00 398337.68750 29.09375** 2017/12/4 9:30 398367.68750 **30.00000** 2017/12/4 10:00 398397.81250 **30.12500** 2017/12/4 10:30 398427.81250 **30.00000** 2017/12/4 11:00 398457.81250 **30.00000** 2017/12/4 11:30 398487.90625 **30.09375** 2017/12/4 12:00 398517.90625 **30.00000** 2017/12/4 12:30 398548.00000 **30.09375** 2017/12/4 13:00 398578.00000 **30.00000** 2017/12/4 13:30 398608.09375 **30.09375** 2017/12/4 14:00 398638.09375 **30.00000** 2017/12/4 14:30 398668.09375 **30.00000** 2017/12/4 15:00 398698.18750 **30.09375**
回答: (SQLServerにデータを投入するという情報から、“他のシステム”がWindows系だと仮定して回答します。また、NTPで戻された=OSの時刻を採用していることも前提になります。) Windows Time サービスは下記の情報の通り、ご質問で**期待されているような時間の精度を持っていません**。ソースにされている情報が、要件をそもそも満たしていないことになるので、“差分”の安定性について再検討する必要があると考えられます。 > > Windows Time サービスの精度 Windows Time サービスは、Kerberos 認証が正常に動作する範囲で NTP Client と NTP Server の時刻を同期することを主な目的とした、ゆるやかな時刻同期を提供する設計となっています。このため、Windows Time サービスにおいては、常に時刻差異が僅少である (1 秒単位の誤差など) 状態を保証することはできません。 > > > > > W32Time サービスは、1 ~ 2 秒の範囲で同期時刻を確実に維持できません。このような許容誤差は、W32Time サービスの設計仕様に含まれていません。 > > >