pyodbc返回SQL Server日期字段为字符串
我正在使用pyodbc来查询一个SQL Server 2008数据库中的表,这个表里有日期类型的列。
查询出来的数据行包含的是日期字符串,而不是Python中的datetime.date或datetime.datetime实例。
这个问题似乎只出现在日期类型的列上;而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)
这是正常现象吗?我该如何最好地解决这个问题呢?
1 个回答
8
使用 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))