我正在使用pyodbc查询具有DATE类型列的SQL Server 2008数据库表。
生成的数据行包含日期字符串,而不是python datetime.date或datetime.datetime实例。
这似乎只是DATE类型的列的问题;正确处理DATETIME类型的列并返回datetime.datetime实例。
import pyodbc
from pprint import pformat
db = pyodbc.connect("DRIVER={SQL Server};SERVER=.\\SQLEXPRESS;DATABASE=scratch;Trusted_Connection=yes")
print pformat(db.cursor().execute("select * from Contract").description)
结果:
(('id', <type 'int'>, None, 10, 10, 0, False),
('name', <type 'str'>, None, 23, 23, 0, False),
('some_date', <type 'unicode'>, None, 10, 10, 0, True),
('write_time', <type 'datetime.datetime'>, None, 23, 23, 3, False))
请注意, some_date 列表示为unicode字符串类型,但是,在数据库中,此列定义为DATE:
CREATE TABLE dbo.Contract(
id INT NOT NULL,
name VARCHAR(23) NOT NULL,
some_date DATE NULL,
write_time DATETIME NOT NULL)
这是正常的,我怎样才能最好地纠正它?
答案 0 :(得分:7)
使用SQL Server本机客户端。例如将 Driver = {SQL Server Native Client 10.0} 放在连接字符串中,而不是 DRIVER = {SQL Server} 。
使用SQL Server ODBC驱动程序重现您的方案,并将日期作为字符串返回。使用2008+兼容版本的SQL Server本机客户端时,会按预期返回日期类型,但看起来datetime2会以字符串形式返回(在我的有限测试中)。
表格定义:
create table dbo.datetest (
[date] date not null,
[datetime] datetime not null,
[datetime2] datetime2 not null
);
insert into
dbo.datetest
values
(CAST(current_timestamp as DATE),
CAST(current_timestamp as datetime),
CAST(current_timestamp as datetime2));
示例:
import pyodbc
from pprint import pformat
db = pyodbc.connect(driver='{SQL Server Native Client 10.0}',
server='TESTSRVR', database='TESTDB',
trusted_connection='yes')
print pformat(db.cursor().execute("select * from dbo.datetest").description)
结果:
(('date', <type 'datetime.date'>, None, 10, 10, 0, False),
('datetime', <type 'datetime.datetime'>, None, 23, 23, 3, False),
('datetime2', <type 'unicode'>, None, 27, 27, 0, False))