当我尝试使用以下内容更新结束日期列时:
update MyTable set EndDate = '2013-07-31 23:59:59.999' where Id = 40
我在桌子上看到的结果是滚动到第二天,所以我的列实际上显示为:
2013-08-01 00:00:00.000
如果我取消毫秒数,它会保持原样,但有什么理由会翻转吗?
当我尝试使用以下内容更新结束日期列时:
update MyTable set EndDate = '2013-07-31 23:59:59.999' where Id = 40
我在桌子上看到的结果是滚动到第二天,所以我的列实际上显示为:
2013-08-01 00:00:00.000
如果我取消毫秒数,它会保持原样,但有什么理由会翻转吗?
Datetime 列的精度不是 1 毫秒,实际上是 10/3 毫秒。
有效条目总是以 0,3 或 7 结尾
23:59:59.997
任何一天的最后一个可能值也是如此。当您尝试插入 .999 时,它会向上取整到最接近的有效值,即次日午夜。
这是一个非常有趣的发现。我在 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
选择结果是:2013-07-31 23:59:59.9990000