【问题标题】:Datetime value in Excel unexpectedly changes when imported into SQL Server 2012导入 SQL Server 2012 时,Excel 中的日期时间值意外更改
【发布时间】:2016-03-22 18:44:08
【问题描述】:

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

无论有没有任何格式,该值总是比 Excel 中的实际时间少 0.003 毫秒。这会导致在尝试按小时分组时应标记为凌晨 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

【问题讨论】:

  • 谢谢你,marc_s。虽然,DATETIME2(3) 仍然返回了 0.997 毫秒,但 DATETIME2(1) 和 DATETIME2(2) 都返回了预期值!

标签: sql-server excel datetime formatted


【解决方案1】:

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

您只能获得 .000.003.007.010.013 等值 - DATETIME 不支持精确到毫秒的值。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 2015-01-21
    相关资源
    最近更新 更多