SQL Server滚动日期结束

时间:2013-10-14 13:58:44

标签: sql sql-server

当我尝试使用以下内容更新结束日期列时:

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

我在桌子上看到的结果是翻到第二天所以我的专栏实际显示为:

2013-08-01 00:00:00.000

如果我把它留下的毫秒数就可以了,但是为什么会这样呢?

2 个答案:

答案 0 :(得分:3)

Datetime列的精度不是1毫秒,实际上是10/3毫秒。

有效条目始终以0,3或7

结尾

因此23:59:59.997是任何指定日期的最后一个可能值。当你试图插入.999时,它会向上舍入到最近的有效值,即午夜 - 第二天。

DATETIME type info

答案 1 :(得分:0)

这是非常有趣的发现。我在SQL Sever 2008中测试了这个表tblTest,生日为datetime2,DateEntry为datetime,与你的EndDate列相同,datetime2可能比datetime更适合你的精度:

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结果是:     2013-07-31 23:59:59.9990000