导入SQL Server 2012时,Excel中的日期时间值意外更改

时间:2016-03-22 18:44:09

标签: sql-server excel datetime formatted

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

无论是否有任何格式化,该值始终比Excel中的实际时间少.003毫秒。这会导致在尝试GROUP BY小时时,应标记为上午1点的值标记为上午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

1 个答案:

答案 0 :(得分:1)

SQL Server中的DATETIME数据类型的准确度为0.003秒 - 3.33毫秒 - 这是一个众所周知且记录在案的事实(请参阅here on MSDN,此处为blog post) 。

您只会获得.000.003.007.010.013等值。DATETIME不支持值到毫秒。

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