SQLServerのDatetimeの23:59:59.998と23:59:59.999

2010/01/27

開発 勉強

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型でもよかった気がしますね、兄貴。

楽天市場でGO

マウスコンピューター期間限定セール

過去の記事はこちら

QooQ