主日期违反日期时间,具有不同的值

Kri*_*ner 1 t-sql sql-server datetime primary-key

让我们忽略a datetime被用作主键的事实.

鉴于以下内容:

DECLARE @table table (test datetime primary key)

INSERT INTO @table
(
    test
)
select
    '2015-09-21 00:00:00.001' -- test - datetime
-- successful insert 

INSERT INTO @table
(
    test
)
select
    '2015-09-21 00:00:00.002' -- test - datetime
-- successful insert

INSERT INTO @table
(
    test
)
select
    '2015-09-21 00:00:00.003' -- test - datetime
-- fails due to primary key violation

select * from @table
Run Code Online (Sandbox Code Playgroud)

SQL Fiddle只有前2个插入

SQL小提琴所有3个插入,第三次插入失败

这里发生了什么?所有这三个"未遂"插入值是不同的,但.002.003被认为是"相同的值"

Sea*_*nge 12

datetime数据类型没有那么多精度.尝试此查询以查看这些值会发生什么.datetime数据类型仅精确到.003.https://msdn.microsoft.com/en-us/library/ms187819.aspx

select CAST('2015-09-21 00:00:00.001' as datetime) union all
select '2015-09-21 00:00:00.002' union all
select '2015-09-21 00:00:00.003'
Run Code Online (Sandbox Code Playgroud)

  • 没有隐式转换,值会四舍五入到最接近的.003 (4认同)

M.A*_*Ali 6

datetime值四舍五入为.000,.003或.007秒的增量,如下表所示.

在此输入图像描述

来源MSDN SQL Server Datetime

因此,您的表值2015-09-21 00:00:00.002四舍五入到2015-09-21 00:00:00.003您的上一次插入,您将获得主键违规.

日期时间可能是让您使用主键的最差数据类型之一.在表中查找备用列或添加代理列以充当主键列.