Excel 中的日期时间值在导入到 SQL Server 2012 时意外更改
Datetime value in Excel unexpectedly changes when imported into SQL Server 2012
我从 Excel 到 SQL 服务器的数据导入有问题。导入目标 table 的 datetime
值与 Excel 源文件中的 datetime
值不同。
无论有无任何格式,该值始终比 Excel 中的实际时间少 .003 毫秒。这会导致在尝试按小时分组时应标记为凌晨 1 点的值被标记为凌晨 12 点。
注意我的示例查询和结果以查看确切的值。
如果有人能告诉我为什么会发生这种情况以及如何获得我的预期结果,我们将不胜感激。
我也想在没有任何额外步骤的情况下解决这个问题。 (请不要暂存 tables)
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\share0322.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 服务器 table 中的值:
2016-03-22 00:14:59.997
预期SQL 服务器值:
2016-03-22 00:15:00.000
Excel 中的值:
3/22/2016 01:00:00 AM
SQL 服务器 table 中的值:
2016-03-22 00:59:59.997
预期SQL 服务器值:
2016-03-22 01:00:00.000
SQL 服务器中的 DATETIME
数据类型的精度为 0.003 秒 - 3.33 毫秒 - 这是众所周知的有据可查的事实(参见 here on MSDN and here a blog post )。
您只能得到 .000
、.003
、.007
、.010
、.013
等值 - DATETIME
不支持值精确到毫秒。
但是,使用 DATETIME2(3)
应该可以解决这个问题(除非使用 OPENROWSET
从 Excel 导入以某种方式破坏了那个)
我从 Excel 到 SQL 服务器的数据导入有问题。导入目标 table 的 datetime
值与 Excel 源文件中的 datetime
值不同。
无论有无任何格式,该值始终比 Excel 中的实际时间少 .003 毫秒。这会导致在尝试按小时分组时应标记为凌晨 1 点的值被标记为凌晨 12 点。
注意我的示例查询和结果以查看确切的值。
如果有人能告诉我为什么会发生这种情况以及如何获得我的预期结果,我们将不胜感激。
我也想在没有任何额外步骤的情况下解决这个问题。 (请不要暂存 tables)
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\share0322.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 服务器 table 中的值:
2016-03-22 00:14:59.997
预期SQL 服务器值:
2016-03-22 00:15:00.000
Excel 中的值:
3/22/2016 01:00:00 AM
SQL 服务器 table 中的值:
2016-03-22 00:59:59.997
预期SQL 服务器值:
2016-03-22 01:00:00.000
SQL 服务器中的 DATETIME
数据类型的精度为 0.003 秒 - 3.33 毫秒 - 这是众所周知的有据可查的事实(参见 here on MSDN and here a blog post )。
您只能得到 .000
、.003
、.007
、.010
、.013
等值 - DATETIME
不支持值精确到毫秒。
但是,使用 DATETIME2(3)
应该可以解决这个问题(除非使用 OPENROWSET
从 Excel 导入以某种方式破坏了那个)