ITエンジニアの成長ブログ

ITエンジニアとして行う勉強の発信&日々の生活で体験した楽しいことをゆるく発信

SQL Serverのdatetime型に気を付ける

SQL Serverのdatetime型を使うときに気を付けるべきことを紹介します。

datetime型は、値の精度について知っておかないといけないことがあります。
たとえば、以下のようなクエリを作成して実行するとその結果に驚く方がいるかもしれません。

f:id:mr_star:20211007182659p:plain
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型を使うのが良さそうです。