SQLserver2005ではまってしまった。
Datetime型(1000分の1秒まで入っている)のカラムに対して、'2010-01-31 23:59:59.999'で検索かけたら'2010-02-01 00:00:00.000'のデータも抽出されてしまう。
'2010-01-31 23:59:59.998'ならちゃんと'2010-01-31 23:59:59.998'までが対象に。
いや、ホントだって。下のSQLを試してごらん。
SELECT convert(datetime,'2010-01-31 23:59:59:998',120)
SELECT convert(datetime,'2010-01-31 23:59:59:999',120)
なんでだ?と思ってしらべたところ
以下の情報が。
Datetime rounding. In SQL Server the end of the day is "23:59:59:998" and if you set the end of the day in Java using the maximum values for each datetime part you get "23:59:59.999" which is treated as the next day by SQL Server.
元はこちら。
し、知らなかった。
そもそもどういう仕様なのかとMicrosoft TechNetで調べてみたら、
datetime型は、300 分の 1 秒、つまり 3.33 ミリ秒または 0.00333 秒の精度で、
1753 年 1 月 1 日から 9999 年 12 月 31 日までの日付と時刻データを格納する
データ型。値は .000、.003、または .007 秒の単位になるように丸めらる。
だって。
つまり、1000分の1秒まで入っているようにみえるけど、1000分の1秒の精度まで表現しているわけではないってことらしい。
まぁ、そもそもミリ秒まで必要ないならsmalldatetime型でもよかった気がしますね、兄貴。
0 件のコメント:
コメントを投稿