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)
私が期待される結果を得ます
これは実際には非常に奇妙です......
なぜ「BETWEEN」を使用する必要がありますか?私が以下にコメントしたように、オープンエンドの範囲は*ずっと*信頼性が高い。 –