SQLServerのdatetime型

  • デル株式会社
  • SQL Serverの日付(datetime)型はミリ秒まで格納できますが、
    精度は1ミリ秒単位ではない。また、制度は0,3,7 しかない。
    なので、yyyy/mm/dd 23:59:59.999 というデータはSQLServer上には存在しえない。

    datetime (Transact-SQL)

    最近、テストレビューしてた時に、境界値試験で、なぜかミリ秒を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)
    

    こうしよう。

    関連記事

    ページ上部へ戻る