当我尝试使用以下内容更新结束日期列时:
update MyTable set EndDate = '2013-07-31 23:59:59.999' where Id = 40
我在桌子上看到的结果是翻到第二天所以我的专栏实际显示为:
2013-08-01 00:00:00.000
如果我把它留下的毫秒数就可以了,但是为什么会这样呢?
答案 0 :(得分:3)
Datetime列的精度不是1毫秒,实际上是10/3毫秒。
有效条目始终以0,3或7
结尾因此23:59:59.997
是任何指定日期的最后一个可能值。当你试图插入.999时,它会向上舍入到最近的有效值,即午夜 - 第二天。
答案 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