Excel中的date时间值在导入到SQL Server 2012中时会意外更改

我的数据从Excel导入到SQL Server时遇到问题。 导入到目标表中的datetime值与Excel源文件中的datetime值不同。

无论是否使用任何格式,该值总是比Excel中的实际时间less0.003毫秒。 这会导致应该标记为凌晨1点的值在尝试GROUP BY小时时标记为12点。

注意我的示例查询和结果以查看确切的值。

如果有人能告诉我为什么发生这种情况,以及如何得到我的预期结果,将不胜感激。

我也想解决这个没有任何额外的步骤。 (请不要登台)

 SELECT Timestamp, CAST(Timestamp AS DATE) Date, CAST(Timestamp AS DATETIME) Datetime, CAST(Timestamp AS DATETIME2) Datetime2, CAST(Timestamp AS TIME) Time FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0','Excel 12.0 Xml;HDR=Yes; Database=\\server\share\160322.xlsx;', 'SELECT * FROM [160322$]') /* Query Results (ALL WRONG): Timestamp : 2016-03-22 00:59:59.997 -- Imported Value without formatting Date : 2016-03-22 -- Formatted Values Datetime : 2016-03-22 00:59:59.997 Datetime2 : 2016-03-22 00:59:59.9970000 Time : 00:59:59.9970000 */ 

Excel中的值:

 3/22/2016 12:15:00 AM 

SQL Server表中的值:

 2016-03-22 00:14:59.997 

预期的SQL Server值:

 2016-03-22 00:15:00.000 

Excel中的值:

 3/22/2016 01:00:00 AM 

SQL Server表中的值:

 2016-03-22 00:59:59.997 

预期的SQL Server值:

 2016-03-22 01:00:00.000 

SQL Server中的DATETIME数据types的准确性为0.003秒-3.33毫秒 – 这是一个众所周知和logging的事实(请参阅MSDN上的这里和这里的博客文章 )。

您只能得到.000.003.007.010.013DATETIME不支持毫秒值。

但是 ,使用DATETIME2(3)应该可以解决这个问题(除非从Excel导入使用OPENROWSET以某种方式破坏)