微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

“无效的日期时间格式”使用 .read_sql() 读取 MS Access 日期/时间值

如何解决“无效的日期时间格式”使用 .read_sql() 读取 MS Access 日期/时间值

尝试读取旧访问 .mdb 时,ODBC 到 python 类型绑定导致问题

一个类似的问题 here,但我无法让它在 python 中工作。

我用它来读取我的 .mdb

import pandas as pd
import os
import pyodbc

##Source Conn
def get_source_conn():
    driver = '{Microsoft Access Driver (*.mdb)}'
    path = r'//SERVER/database.mdb'
    assert os.path.exists(path)

    return pyodbc.connect(driver=driver,dbq=path,CHARSET='UTF8')

def safeRead(sql):
    try:
        conn = get_source_conn()
        conn.setdecoding(pyodbc.sql_CHAR,encoding='utf-8')
        conn.setdecoding(pyodbc.sql_WCHAR,encoding='utf-8')
        # conn.setdecoding(pyodbc.sql_TYPE_DATE,encoding='utf-8')
   
        df = pd.read_sql(sql,conn)
    finally:
        try:
            conn.close()
        except:
            pass
    return df
    
class InventoryTransaction():

    @classmethod
    def all(cls):
        return safeRead('SELECT * FROM [INVENTORY TRANSACTIONS]')

dfTransactionTarget = InventoryTransaction.all()

以上产生此错误

DataError: ('22007','[22007] [Microsoft][ODBC Microsoft Access Driver]Invalid datetime format on column number 2 (TransactionDate) (35) (sqlGetData)')

如果我取消注释类型绑定以尝试将 sql_TYPE_DATE 转换为字符串,我会得到:

ValueError: Invalid sqltype 91.  Must be sql_CHAR or sql_WCHAR or sql_WMetaDATA

如果我可以完全以字符串形式获取 ODBC 的结果,我也可以强制自己执行所有类型,因为所讨论的数据不是那么大的集合。

我如何成功读取这些数据?

**其他信息基于@GordThompson 的建议 **

  1. CStr 似乎不能处理 NULLS
((
    "SELECT "
    "[TransactionID],"
    "CStr([TransactionDate]) AS someCol,"
    "[ProductID] "
    "FROM [INVENTORY TRANSACTIONS] "
    # "WHERE ISNULL([TransactionDate]) = 0 "
))

输出

DataError: ('22018','[22018] [Microsoft][ODBC Microsoft Access Driver] Invalid use of Null (-3030) (sqlGetData)')
  1. 即使我过滤掉空值,我也没有得到可以使用的东西:
((
    "SELECT "
    "[TransactionID],"
    "[ProductID] "
    "FROM [INVENTORY TRANSACTIONS] "
    "WHERE [TransactionDate] IS NULL "
))

输出

DataError: ('22018','[22018] [Microsoft][ODBC Microsoft Access Driver] Invalid use of Null (-3030) (sqlGetData)')
#(same error)
  1. 如果我尝试更复杂的事情:
((
    "SELECT "
    "[TransactionID],"
    "IIF(ISNULL([TransactionDate]),'',CStr([TransactionDate])) AS someCol,'[22018] [Microsoft][ODBC Microsoft Access Driver] Invalid procedure call (-3030) (sqlGetData)')

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。