为什么散装插入DateTime字段的千分之一



我正在尝试将数据插入到包括毫秒的日期列中。

CREATE TABLE Foo (
  Id UNIQUEIDENTIFIER NOT NULL PRIMARY KEY DEFAULT newsequentialid(),
  StartTime DATETIME NOT NULL,
  EndTime DATETIME NOT NULL,
  Baz DECIMAL(7,3) NULL
);

我的输入CSV文件看起来像这样:

 ,2016-01-28 17:16:05.000,2016-01-28 17:17:04.999,5.693
 ,2016-01-28 17:17:05.000,2016-01-28 17:18:04.999,5.275

我的批量插入脚本看起来像这样:

BULK INSERT dbo.Foo
FROM 'C:foo.csv' 
WITH (CHECK_CONSTRAINTS, FIELDTERMINATOR = ',' , ROWTERMINATOR = '0x0a');

但是,当我在插入的数据上选择 *时,我会得到:

F80992B3-F9DB-E611-80C3-000D3AB157F3,2016-01-28 17:16:05.000,2016-01-28 17:17:05.000,5.693
F90992B3-F9DB-E611-80C3-000D3AB157F3,2016-01-28 17:17:05.000,2016-01-28 17:18:05.000,5.275

为什么散装插入末端毫秒毫秒,我该如何纠正?

这不是bulk insert。这是datetime数据类型的性质。如(巧妙的)在文档中指出:

四舍五入为.000,.003或.007秒

因此,该值将四舍五入为适当的增量。

发生了这种情况,因为DateTime具有3.33ms的精度。这意味着4.999被四舍五入为5.000。

避免此问题使用DateTime2(3)代替。

这里确实有很好的解释

最新更新