0

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

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

我在桌子上看到的结果是滚动到第二天,所以我的列实际上显示为:

2013-08-01 00:00:00.000

如果我取消毫秒数,它会保持原样,但有什么理由会翻转吗?

4

2 回答 2

3

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

有效条目总是以 0,3 或 7 结尾

23:59:59.997任何一天的最后一个可能值也是如此。当您尝试插入 .999 时,它会向上取整到最接近的有效值,即次日午夜。

DATETIME 类型信息

于 2013-10-14T14:05:44.853 回答
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

选择结果是:2013-07-31 23:59:59.9990000

于 2013-10-14T14:20:41.407 回答