• 締切済み

Datetime型 条件について

お世話になります。 以下のSQL文を実行したところ、更新されなくて困っております。 UPDATE RCV SET STATUS = '0' WHERE REC = convert(datetime,'2009/11/17 22:54:51') UPDATE RCV SET STATUS = '0' WHERE REC = '2009/11/17 22:54:51' 日付をコメントにすると、問題なく更新されます。 すいませんが、ご教授いただきたく宜しくお願い致します。

みんなの回答

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

#1です。 本当は998と指定することと、997と指定することは同じことです。 実はDATETIMEの一番最後(ミリ秒)の部分には「0,3,7の3種類の数字しか収録されない」のです。 それ以外の数字を入れようとしても丸められてしまいます。 http://msdn.microsoft.com/ja-jp/library/ms187819.aspx 例えば'2009/11/18 10:00:00.998'をセットしようとすると、 8ミリ秒=7ミリ秒+1/3と判断されてしまい、丸めて7ミリ秒になるということです。 結果は'2009/11/18 10:00:00.997'になります。 したがって'2009/11/18 10:00:00.999'をセットしようとすると、'2009/11/18 10:00:01.000'になります。 9ミリ秒=7ミリ秒+2/3と判断し、丸めた結果切り上がるというわけです。

すると、全ての回答が全文表示されます。
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

RECはdatetime型だとして、どうやってセットされた時刻なのですか? datetimeはミリ秒まで収録可能ですから、GETDATE()などを使ってセットしたものであれば、ミリ秒まで収録されています。 そうすると当然条件を満たさなくなります。 UPDATE RCV SET STATUS = '0' WHERE REC BETWEEN '2009/11/17 22:54:51.000' AND '2009/11/17 22:54:51.998' など工夫する必要があるでしょう。

noname#164045
質問者

補足

早々のご回答誠にありがとうございます。 結局のところ、 UPDATE RCV SET STATUS = '0' WHERE CONVERT(VARCHAR,REC,120)='2009-11-17 22:54:51' にすることで、解決しました。 しかしながら、再度ご質問なのですが、 UPDATE RCV SET STATUS = '0' WHERE REC BETWEEN '2009/11/17 22:54:51.000' AND '2009/11/17 22:54:51.998' を UPDATE RCV SET STATUS = '0' WHERE REC BETWEEN '2009/11/17 22:54:51.000' AND '2009/11/17 22:54:51.999' にすると、次分の"2009/11/17 22:54:52"まで取得されてしまいました。この現象は"22:54:51.998"であれば、取得できるのでしょうか。 '999'と'998'の違いはどのような違いになるのでしょうか。 ご参考までに、ご教授いただければ幸いです。 宜しくお願い致します。

すると、全ての回答が全文表示されます。

関連するQ&A