none
SQL Server のMillisecond について RRS feed

  • 質問

  • 皆様いつもありがとうございます。

    SQL Server に登録されるDatetime のMillisecond が、入力した時刻と違ってしまうことについての質問です。

    テーブルは
    datetime [Date]
    dateTime [InputTime]
    nvarchar(300) [Contents]
    で構成されています。

    [Date]は日付以外の時間は0ですが、[InputTime]はVisual Studio でのDateTime.Now(時刻)です。
    このとき、[Date], [InputTime], [Contents] をSQL Server に入力すると、


    [InputTime] が、
    2012/09/02 14:27:16 566
    とInsert したはずなのに、SQL Server では、
    2012/09/02 14:27:16 567
    と入力されていました。

    このため、テーブルから登録時間(InputTime)を2012/09/02 14:27:16 566 で検索すると見つからないという現象が起こってしまいます。
    この原因と、解決策をご教授いただけないでしょうか?

    どうぞ、よろしくお願いいたします。

    2012年9月2日 5:39

回答

  • datetime型の説明にこうあります。SQL Server 2008以降であればdatetime2を使うとか。

    精度: 値は、.000、.003、または .007 秒単位に丸められます。
    • 回答としてマーク Frick Pix 2012年9月2日 7:54
    2012年9月2日 6:18
  • でも、これもまたバージョンによって、変わってくるのかもしれませんね。変化についていくしかないと感じて若干途方に暮れてます。初めからその通りに丸めてSQL Server に入力してしまえば、バージョンの変化に少し遅れても大丈夫なようになるかな?

    互換性は考慮されているのでこの挙動は変わらないと思います。一応datetime型の各バージョンに関するドキュメントですが 2000 / 2005 / 2008 / 2008 R2 / 2012 と一貫しています。

    プログラム的に先に丸めるのでもいいです。またプログラムで比較するのではなく、SQL Server上で比較すれば自動的に丸めてからの比較になりませんか?

    • 回答としてマーク Frick Pix 2012年9月11日 16:28
    2012年9月3日 2:25

すべての返信

  • datetime型の説明にこうあります。SQL Server 2008以降であればdatetime2を使うとか。

    精度: 値は、.000、.003、または .007 秒単位に丸められます。
    • 回答としてマーク Frick Pix 2012年9月2日 7:54
    2012年9月2日 6:18
  • ありがとうございます。

    datetime における 1 秒未満の秒の有効桁数の丸め処理
    が行われるということだったのですね。

    これで長いこと苦戦していたことが解決しました。

    でも、これもまたバージョンによって、変わってくるのかもしれませんね。変化についていくしかないと感じて若干途方に暮れてます。初めからその通りに丸めてSQL Server に入力してしまえば、バージョンの変化に少し遅れても大丈夫なようになるかな?

    2012年9月2日 8:04
  • でも、これもまたバージョンによって、変わってくるのかもしれませんね。変化についていくしかないと感じて若干途方に暮れてます。初めからその通りに丸めてSQL Server に入力してしまえば、バージョンの変化に少し遅れても大丈夫なようになるかな?

    互換性は考慮されているのでこの挙動は変わらないと思います。一応datetime型の各バージョンに関するドキュメントですが 2000 / 2005 / 2008 / 2008 R2 / 2012 と一貫しています。

    プログラム的に先に丸めるのでもいいです。またプログラムで比較するのではなく、SQL Server上で比較すれば自動的に丸めてからの比較になりませんか?

    • 回答としてマーク Frick Pix 2012年9月11日 16:28
    2012年9月3日 2:25