- 2013-3-27
- SQLServer
SQL Serverの日付(datetime)型はミリ秒まで格納できますが、
精度は1ミリ秒単位ではない。また、制度は0,3,7 しかない。
なので、yyyy/mm/dd 23:59:59.999 というデータはSQLServer上には存在しえない。
最近、テストレビューしてた時に、境界値試験で、なぜかミリ秒を999にしないで、テストしてる人がいたので
NG出そうとしたら、なぜか999にできないって言われたので調べたらわかった。
select cast('2013-01-01 12:34:56.000' as datetime) select cast('2013-01-01 12:34:56.001' as datetime) select cast('2013-01-01 12:34:56.002' as datetime) select cast('2013-01-01 12:34:56.003' as datetime) select cast('2013-01-01 12:34:56.004' as datetime) select cast('2013-01-01 12:34:56.005' as datetime) select cast('2013-01-01 12:34:56.006' as datetime) select cast('2013-01-01 12:34:56.007' as datetime) select cast('2013-01-01 12:34:56.008' as datetime) select cast('2013-01-01 12:34:56.009' as datetime) select cast('2013-12-31 23:59:59.997' as datetime) select cast('2013-12-31 23:59:59.998' as datetime) select cast('2013-12-31 23:59:59.999' as datetime)
–実行結果
2013-01-01 12:34:56.000
2013-01-01 12:34:56.000
2013-01-01 12:34:56.003
2013-01-01 12:34:56.003
2013-01-01 12:34:56.003
2013-01-01 12:34:56.007
2013-01-01 12:34:56.007
2013-01-01 12:34:56.007
2013-01-01 12:34:56.007
2013-01-01 12:34:56.010
2013-12-31 23:59:59.997
2013-12-31 23:59:59.997
2014-01-01 00:00:00.000
そういうことなので、datetime型のbetweenは使いづらいので、大なり小なりを使ったほうがよいかな。と
↓×
test_tm between cast('2013/01/01 0:00:00',datetime) and cast('2013/01/01 23:59:59.999',datetime)
こうすると、2013/01/02 のものをとってきてしまう。
↓○
test_tm >=cast('2013/01/01 0:00:00',datetime) and test_tm < cast('2013/01/02 00:00:00.000',datetime)
こうしよう。