SQL Serverのdatetime型を使うときに気を付けるべきことを紹介します。
datetime型は、値の精度について知っておかないといけないことがあります。
たとえば、以下のようなクエリを作成して実行するとその結果に驚く方がいるかもしれません。
実行結果は以下の通りです。分かりやすいように整形してます。
入力リテラル | datetime型格納値 |
---|---|
2021-10-07 12:35:29.120 | 2021-10-07 12:35:29.120 |
2021-10-07 12:35:29.121 | 2021-10-07 12:35:29.120 |
2021-10-07 12:35:29.122 | 2021-10-07 12:35:29.123 |
2021-10-07 12:35:29.123 | 2021-10-07 12:35:29.123 |
2021-10-07 12:35:29.124 | 2021-10-07 12:35:29.123 |
2021-10-07 12:35:29.125 | 2021-10-07 12:35:29.127 |
2021-10-07 12:35:29.126 | 2021-10-07 12:35:29.127 |
2021-10-07 12:35:29.127 | 2021-10-07 12:35:29.127 |
2021-10-07 12:35:29.128 | 2021-10-07 12:35:29.127 |
2021-10-07 12:35:29.129 | 2021-10-07 12:35:29.130 |
いかがでしょうか。入力したリテラル値とdatetime型格納値で異なる部分があると思います。
実はdatetime型では入力した値が、 .000、.003、または .007 秒の単位になるように丸められます。そのため、上記のような挙動となっています。
以前、datetime型を主キーに設定しているテーブルを使ったプログラムがあったのですが、入力した値で検索しても、検索できないという事象が発生しました。
しかも、この事象が発生したりしなかったりという一番恐ろしい挙動でした。
このdatetime型の仕様を知ってさえいれば、何も問題なかったのですがまったく知らなかったのでかなり驚きました。
Webで見てるとこの挙動に惑わされている人もちらほら見かけますね。。
たしかにこれは、知らないと1回ははまりますね。。
上記の挙動は困る!厳密に値を格納したい!という場合には、代わりにdatetime2型を使うのが良さそうです。