當我嘗試使用下面的更新我的結束日期列:SQL Server的滾動日期超過
update MyTable set EndDate = '2013-07-31 23:59:59.999' where Id = 40
我看到在我的表是滾動到下一個日子,所以我的專欄實際上是呈現爲結果:
2013-08-01 00:00:00.000
如果我脫離毫秒它離開它,但它的任何原因,爲什麼這是滾動?
當我嘗試使用下面的更新我的結束日期列:SQL Server的滾動日期超過
update MyTable set EndDate = '2013-07-31 23:59:59.999' where Id = 40
我看到在我的表是滾動到下一個日子,所以我的專欄實際上是呈現爲結果:
2013-08-01 00:00:00.000
如果我脫離毫秒它離開它,但它的任何原因,爲什麼這是滾動?
日期時間列的精度不是1毫秒,但實際上是10/3毫秒。
有效條目總是以0,3或7
端,以便23:59:59.997
在任何一天,最後可能的值。當您嘗試插入.999時,它會四捨五入到最接近的有效值,即第二天的午夜。
謝謝這就是我所需要的 –
這是非常有趣的發現。我在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
「EndDate」列的日期時間的數據類型?如果是這樣,這就解釋了這個問題。 'Datetime'的精度爲1 tick(3ms),因此999ms會四捨五入到1s。秒的最後「滴答」是997毫秒。 –
爲什麼不使用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 –
使用包含開始日期時間和*獨佔*結束日期時間幾乎總是一種更好的間隔模型(這可能是亞倫試圖說的)。 –