2012-02-26 7 views
0

SQL ServerでBetweenコマンドを使用しています。SQL Serverで明日の前の最後のmsを取得しますか?

は私が見つける必要がある:将来のクエリは、その値を使用する必要がありますので、[000:00:00:00 2012-02-27]を、私はしたくない

select * from MyTable where myDate 
between getdate() and [1ms before tomorrow = 2012-02-26 :23:59:59:999] 

私は明日の1ms前に必要です。

しかし、これは私が試したことですが、何らかの理由で私に欲望の価値を与えることを拒否しています! と私に教えてください:2012-02-26 23:59:59.997 +予測不可能な結果!

なぜですか?私は何が欠けていますか?

私は2012-02-26 :23:59:59:999を取得したいです!

enter image description here

+0

なぜ「BETWEEN」を使用する必要がありますか?私が以下にコメントしたように、オープンエンドの範囲は*ずっと*信頼性が高い。 –

答えて

2

SQL ServerのDATETIMEは3.33msの精度を持っている - あなたはは常にがいっぱい時間に最も近い値として.997を取得します。それだけですが、SQL Server 2005では変更できません。Demystifying the SQL Server DATETIME datatypeですべて読むことができます。

SQL Server 2008では、精度が100nsのDATETIME2データ型を使用できます。したがって、小数点第2位の後に正確に7桁の数字があります。

更新:あなたはDATETIME2で0.999を取得したい場合は、あなたが使用する必要があります。

DECLARE @dt2 DATETIME2 
-- you need to cast GETDATE() to DATETIME2 - otherwise it's a DATETIME ! 
SET @dt2 = CAST(GETDATE() AS DATETIME2) 

DECLARE @dt2_Added DATETIME2 
SET @dt2_Added = DATEADD(d, DATEDIFF(d, 0, @dt2) + 1, 0) 

SELECT DATEADD(ms, -1, @dt2_added) 

結果:

2012-02-26 23:59:59.9990000 

更新#2:のものはまだ見知らぬ人を取得します.....

私がの代わりに私は結果を得る

DECLARE @dt2 DATETIME2 
SET @dt2 = SYSDATETIME() 

SELECT DATEADD(ms, -1, DATEADD(d, DATEDIFF(d, 0, @dt2) + 1, 0)) 

2012-02-27 00:00:00.000 

を私は同じ計算をすれば、私はワンステップで計算を行う場合 -、それは右に行くから私DATETIME2を与えます二つのステップで:

2012-02-26 23:59:59.9990000 

DECLARE @dt2 DATETIME2 
SET @dt2 = SYSDATETIME() 

DECLARE @dt2_Added DATETIME2 
SET @dt2_Added = DATEADD(d, DATEDIFF(d, 0, @dt2) + 1, 0) 

SELECT DATEADD(ms, -1, @dt2_added) 

私が期待される結果を得ます

これは実際には非常に奇妙です......

+0

私は99:999値でオブジェクトを構築できますか? –

+0

@RoyiNamir:** SQL Server 2005のDATETIMEデータ型ではありません。 –

+0

まだありません。http://i.stack.imgur.com/don69.jpg –

3

代わりに排他的な範囲を指定しないのはなぜですか?

SELECT * FROM `MyTable` 
WHERE `myDate` >= GETDATE() AND `myDate` < (tomorrow) 

(私は通常、MySQLの男だけど、私はあなたがすでにそれを行う方法を知っていると信じて明日のDATETIMEを取得する方法を見つけ出すために気にすることはできません。)

そうでない場合あなたは疑わしい精度の浮動小数点値を使いこなしています。

+0

私の最初の行は '私はコマンド間で使用しています ' –

+2

@RoyiNamir:はい、私は知っています。私はあなたがそうでないことを示唆しているので、代わりに "代わりに"という言葉を使用します。 'BETWEEN'は_inclusive range_を実装していますが、あなたは_exclusive range_を実装しようとしています。包括的な範囲をハッキングするのではなく、適切に行うのはなぜですか? –

+0

@Royiあなたが* BETWEENを使用しているからといって、あなたがすべきではありません。何が起こったのかを推測すると、基礎となるデータ型は「SMALLDATETIME」に変更されますか?これらの記事を読んでください:http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil-have-in-common.aspx http:// sqlblog。 com/blogs/aaron_bertrand/archive/2011/09/20/bad-habits-to-kick-using-date-time-operations.aspxを使用してhttp://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries.aspx ...私は、信頼できない、直感的ではない「BETWEEN」がいかにしてどれくらいのことができるかを十分に強調することはできません。 –

関連する問題