【问题标题】:"Conversion failed when converting date" while inserting CSV data插入 CSV 数据时出现“转换日期时转换失败”
【发布时间】:2018-02-15 06:56:33
【问题描述】:

我正在尝试使用以下代码将数据从 CSV 插入 SQL 表:

with requests.get(reportURL) as csvfile:
    decoded_content=csvfile.content.decode('utf-8')
    reader = csv.reader(decoded_content.splitlines(), delimiter=',')
    columns = next(reader,None)
    query = "INSERT INTO SQL_TABLE({0}) VALUES ({1})"
    query = query.format('[{0}]'.format('],['.join(columns)),','.join('?'*len(columns)))
    cursor = cnxn.cursor()
    cursor.execute(query, columns)
    for data in reader:
        cursor.execute(query, data)
    cursor.commit() 

但是,我收到以下错误代码:

cursor.execute(query, columns) pyodbc.DataError: ('22007', '[22007] [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]转换 从字符串转换日期和/或时间时失败。 (241) (SQLExecDirectW)')

我想知道问题是否在于数据是作为字符串而不是日期传递的?日期是第一列,所以我不确定其他列是否会遇到类似问题。 栏目如下:

日期 |广告商 |活动 |广告组 |展示次数

数据类型:

日期时间 |变量 |变量 |变量 |大整数

感谢您的帮助!

【问题讨论】:

  • 您的日期在 csv 数据中是如何表示的?
  • > 2017 年 9 月 5 日 |广告商 1 |活动 1 |广告组 1 | 125 没有引号,如图所示。
  • 日期是m/d/yyyy,还是d/m/yyyy
  • m/d/yyyy,这就是它在csv中的显示方式,并且似乎在sql数据中表示。
  • 在您的 SQL 中,如果您将 VALUES (?, ?, ?, ?) 更改为 VALUES (CONVERT(datetime, ?, 101), ?, ?, ?) 会怎样?

标签: python sql-server database csv pyodbc


【解决方案1】:
cursor.execute(query, columns)

您正在尝试使用列 names 作为数据来执行 INSERT 语句。 SQL Server 抱怨是因为您试图将值“日期”插入datetime 列。删除该语句应该可以解决问题。

【讨论】:

  • 我认为你是对的!但如果它不是一个问题,那就是另一个问题。现在我得到 将数据类型 nvarchar 转换为 bigint 时出错。 (8114) (SQLExecDirectW)')
  • @Jamesdabeard: try: cursor.execute(query, data) 然后 except: print(data) 以及在 except 子句中做一个裸 raise 以重新引发异常。然后你会看到它抱怨的是哪一行数据。当您使用它时,您也可以print(query) 以确保查询是您认为的那样。
  • 当我打印时,我看到数据以引号括起来:'112'、'0'、'0.414' 等,这可能是问题所在?
  • @Jamesdabeard - 引号本身不一定是问题,但如果您在 [Impressions] 列中看到“0.414”,那么 有问题,因为 0.414 不可能存储在bigint 列中。
  • 是的!一切都解决了!非常感谢您的帮助!
【解决方案2】:

我不知道它是否仍然相关,但是在尝试从特定时间戳中按日期过滤数据库时出现此错误。 我发现问题出在参考点的数据格式上,像这样:'2020-07-26 12:07:22.263000'

解决方案是在几秒钟后使用 str(my date)[:19] 删除访问数据

【讨论】:

  • 当然,例如 datetime.now() 会给出类似“datetime.datetime(2021,2,25,22,9,41,879400)”的日期格式,字符串为它将是“2021-2-25 22:11:41.879400”,它的 datetime.timestamp 看起来像 1614284051.277761,浮点格式。因此您可以将 datetime.timestamp(datetime.now()) 强制为 int,接收 1614284051,然后创建 int 时间戳的 datetime.fromtimestamp()。或使用 str 格式并选择前 19 个字符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多