コミュニティでの活動の履歴として、自身(Orator/魔界の仮面弁士)が掲示板・Mailing List・Newsgroup等へ発言した内容の中で、再利用できそうな物を拾い出して、掲載しています。

« 2006年11月 | Main | 2007年03月 »
[Jet]古い日付値を扱う場合の注意点 / 2006年12月03日(日)
table1
id date1 date2
1 1899/12/31 10:00:00 1899/12/31 20:00:00
2 1899/12/01 10:00:00 1899/12/01 20:00:00

上記のようなデータに対し、下記のクエリを発行してみます。

SELECT * FROM table1 WHERE date1 < date2

すると、id=1 はヒットするが、id=2 はヒットしないという、不都合のある状況になります。


これは、Jetの日付型の特性によるものです。

Jet の日付型は、「1899/12/30 00:00:00 からの経過日数」を、『倍精度浮動小数点型(Double)』で管理したものとなっています。

日付部の範囲は 100年1月1日〜9999年12月31日で、内部値の整数部は、 -657,434 〜 2,958,465 という範囲の値となります。

時刻部に関しては、たとえば 18:00:00 ならば、1日の 4分の3 として、0.750 という値をとります。06:00:00 なら、0.250 です。

そして、ここからが問題となる箇所なのですが…。

この時刻部というのは、内部値の絶対値に対する小数部として表されるため、負数となる範囲では、同一日の時刻判定に不都合が生じ、今回の例のような問題が発生します。

言葉で書くと分かりにくいので、表にしてみますと、1899/12/30 以上と未満とで、時刻部の方向が逆転している事がわかるかと思います。

+1.50……1899/12/31 12:00:00
+1.00……1899/12/31 00:00:00
+0.75……1899/12/30 18:00:00
+0.50……1899/12/30 12:00:00
+0.25……1899/12/30 06:00:00
0.00……1899/12/30 00:00:00
-0.25……(未使用領域)
-0.50……(未使用領域)
-0.75……(未使用領域)
-1.00……1899/12/29 00:00:00
-1.25……1899/12/29 06:00:00
-1.50……1899/12/29 12:00:00
-1.75……1899/12/29 18:00:00
-2.00……1899/12/28 00:00:00
-2.50……1899/12/28 12:00:00

もっとも、こんな古い日付値を(それも時刻部も含めた形で)保持する事は、稀だと思いますので、実運用上は、さほど支障は無いと思います。

とはいえ、この現象は、Jetのみならず、VBA/VB6/VBScript にも言える事なので、注意しておいた方が良いでしょうね。(VB.NETのDate型は問題なし)。


 
Posted at 02:43 / Jet/Access / この記事のURL
コメント(1)
P R

Microsoft Most Valuable Professional, Visual Developer - Visual BasicMSMVP for Visual Basic


Global Media Online INC.