電子書籍の厳選無料作品が豊富!

お世話になります。
以下の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'

日付をコメントにすると、問題なく更新されます。

すいませんが、ご教授いただきたく宜しくお願い致します。

A 回答 (2件)

#1です。



本当は998と指定することと、997と指定することは同じことです。

実はDATETIMEの一番最後(ミリ秒)の部分には「0,3,7の3種類の数字しか収録されない」のです。
それ以外の数字を入れようとしても丸められてしまいます。
http://msdn.microsoft.com/ja-jp/library/ms187819 …

例えば'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と判断し、丸めた結果切り上がるというわけです。
    • good
    • 0

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'
など工夫する必要があるでしょう。

この回答への補足

早々のご回答誠にありがとうございます。

結局のところ、
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'の違いはどのような違いになるのでしょうか。
ご参考までに、ご教授いただければ幸いです。
宜しくお願い致します。

補足日時:2009/11/18 08:47
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!