代码之家  ›  专栏  ›  技术社区  ›  Omortis

如何更改日期时间。pyodbc下字符串的时间返回类型?

  •  1
  • Omortis  · 技术社区  · 6 年前

    我已经将现有大型Python 2项目的代码库从 pymssql pyodbc . 移动很容易,所有内容都可以构建并运行良好,除了pyodbc返回类型为time的SQL Server列 datetime.time ,其中pymssql(以及PostgreSQL本机驱动程序)返回字符串。

    意思是,我收到 datetime.time(11, 54, 13, 161000) 对象而不是 11:54:13.161000 . 是否有任何方法可以在不诉诸某种存储过程的情况下全局更改此行为?处理返回的对象而不是返回的字符串将需要几天的重构和测试。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Gord Thompson    6 年前

    您可以使用pyodbc Output Converter function 捕获从SQL Server返回的时间值并将其格式化为字符串。

    之前:

    import pyodbc
    
    cnxn = pyodbc.connect('DSN=SQLmyDb;', autocommit=True)
    crsr = cnxn.cursor()
    
    rtn = crsr.execute("SELECT CAST('11:54:13.161' AS TIME)").fetchval()
    print(repr(rtn))  # datetime.time(11, 54, 13, 161000)
    
    crsr.close()
    cnxn.close()
    

    之后:

    import pyodbc
    import struct
    
    
    def time_as_string(raw_bytes):
        tup = struct.unpack("<4hI", raw_bytes)  # e.g., (11, 54, 13, 0, 161000000)
        tweaked = [tup[i] // 100 if i == 4 else tup[i] for i in [0, 1, 2, 4]]
        return "{:02d}:{:02d}:{:02d}.{:07d}".format(*tweaked)
    
    
    cnxn = pyodbc.connect('DSN=SQLmyDb;', autocommit=True)
    cnxn.add_output_converter(pyodbc.SQL_SS_TIME2, time_as_string)
    crsr = cnxn.cursor()
    
    rtn = crsr.execute("SELECT CAST('11:54:13.161' AS TIME)").fetchval()
    print(repr(rtn))  # '11:54:13.1610000'
    
    crsr.close()
    cnxn.close()