【问题标题】:Using Python to insert Excel DATE (not datetime) data into a SQL Server使用 Python 将 Excel DATE(不是日期时间)数据插入 SQL Server
【发布时间】:2019-11-20 16:29:17
【问题描述】:

我正在尝试使用 Python 将 Excel 工作簿数据导入 SQL Server,但在我尝试导入与浮点数据类型不兼容的值时,在 TERM_DATE 列下。

该列在 Excel 中的外观:

TERM_DATE
43101
43101
43101
43101
43132

我需要 SQL Server 列的外观

TERM_DATE
2018-01-01
2018-01-01
2018-01-01
2018-01-01
2018-02-01

额外信息:

TERM_DATE 是我创建的表中的一列,是 SQL Server 中的 date 数据类型;当我使用 Python 尝试将 TERM_DATE 列从 Excel 导入 SQL Server 时,我收到此错误:

DataError: ('22018', '[22018] [Microsoft][ODBC SQL Server Driver][SQL Server]操作数类型冲突:float 与日期不兼容 (206) (SQLExecDirectW); [22018] [Microsoft][ ODBC SQL Server 驱动程序][SQL Server]无法准备语句。(8180)')

【问题讨论】:

  • Excel 会将 43101 显示为 2018-01-1,但单元格中实际显示的是 43101

标签: python sql-server python-3.x


【解决方案1】:

新的datedatetime2 列不允许将float 转换为datetime 和从datetime 转换的恶作剧。 SQL Server datetime 和 Excel 日期都在内部存储为浮点数,但 Excel 的“零日期”是 1900-01-00,而 SQL Server 使用 1900-01-01,并且 Excel 有一个错误,它将 1900 视为飞跃年。

因此,如果您从 Excel 数字中减去 2,然后转换为 datetime,然后再转换为 date,您应该得到相同的值。

例如:

insert into T(id, date) values (?, cast(?-2 as datetime))

【讨论】:

  • 加上一个打字速度比我快的,另外我会加入我将要包含的链接,以便进一步阅读有关 Excel 日期怪异的一些有趣的进一步阅读。 cpearson.com/excel/datetime.htm
猜你喜欢
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-30
相关资源
最近更新 更多