2013-10-14 45 views
0

當我嘗試使用下面的更新我的結束日期列:SQL Server的滾動日期超過

update MyTable set EndDate = '2013-07-31 23:59:59.999' where Id = 40 

我看到在我的表是滾動到下一個日子,所以我的專欄實際上是呈現爲結果:

2013-08-01 00:00:00.000 

如果我脫離毫秒它離開它,但它的任何原因,爲什麼這是滾動?

+1

「EndDate」列的日期時間的數據類型?如果是這樣,這就解釋了這個問題。 'Datetime'的精度爲1 tick(3ms),因此999ms會四捨五入到1s。秒的最後「滴答」是997毫秒。 –

+0

爲什麼不使用LastDate並在午夜存儲該日期,並且確保值在23:59:59.997之前發生值的任何子句都使用<= DATEADD(DAY,1,LastDate)?由於各種日期/時間類型的精度不同,試圖找到一天中的最後時刻是有問題的。如果切換到datetime2(7),則23:59:59.999甚至不是當天最後一個可能的時刻。 http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil-have-in-common.aspx –

+1

使用包含開始日期時間和*獨佔*結束日期時間幾乎總是一種更好的間隔模型(這可能是亞倫試圖說的)。 –

回答

3

日期時間列的精度不是1毫秒,但實際上是10/3毫秒。

有效條目總是以0,3或7

端,以便23:59:59.997在任何一天,最後可能的值。當您嘗試插入.999時,它會四捨五入到最接近的有效值,即第二天的午夜。

DATETIME type info

+0

謝謝這就是我所需要的 –

0

這是非常有趣的發現。我在SQL Sever的2008年測試了這個表TBLTEST,用生日作爲DATETIME2和DateEntry的日期時間是與您的結束日期列,DATETIME2可能比日期時間更好地滿足您的精度:

CREATE TABLE [dbo].[tblTest](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [Name] [nvarchar](255) NULL, 
    [Birthday] [datetime2](7) NULL, 
    [DateEntry] [datetime] NULL, 
CONSTRAINT [PK_tblTest] PRIMARY KEY CLUSTERED 
(
    [ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,    ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

INSERT INTO tblTest (Name) VALUES('Spielberg'); 

UPDATE tblTest SET DateEntry = '2013-07-31 23:59:59.999' WHERE ID=1 

顯示完全相同的結果如你:

2013-08-01 00:00:00.000 

現在生日作爲DATETIME2,精度是令人滿意的:

UPDATE tblTest SET Birthday = '2013-07-31 23:59:59.999' WHERE ID=1 

SELECT結果是: 2 013-07-31 23:59:59.9990000