如何在pyodbc下将datetime.time返回类型更改为string?

时间:2018-01-16 18:29:23

标签: python sql-server pyodbc

我已将大型现有Python 2项目的代码库从pymssql移至pyodbc。移动很简单,一切都构建好,并且运行正常,除了pyodbc将类型为time的SQL Server列返回为datetime.time,其中pymssql(以及PostgreSQL本机驱动程序)返回字符串。

意思是,我收到datetime.time(11, 54, 13, 161000)个对象而不是11:54:13.161000。有没有什么办法可以在不诉诸某种存储过程的情况下全局改变这种行为?处理返回的对象而不是返回的字符串将涉及几天的重构和测试。

1 个答案:

答案 0 :(得分:3)

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

在:

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()