Python pyodbc以字符串形式返回SQL Server日期字段

Python pyodbc以字符串形式返回SQL Server日期字段,python,sql-server,database,pyodbc,Python,Sql Server,Database,Pyodbc,我正在使用pyodbc查询包含日期类型列的SQLServer2008数据库表 生成的数据行包含日期字符串,而不是python datetime.date或datetime.datetime实例 这似乎只是日期类型列的问题;DATETIME类型的列处理正确,并返回DATETIME.DATETIME实例。 例子 结果: (('id', <type 'int'>, None, 10, 10, 0, False), ('name', <type 'str'>, None, 23

我正在使用pyodbc查询包含日期类型列的SQLServer2008数据库表

生成的数据行包含日期字符串,而不是python datetime.date或datetime.datetime实例

这似乎只是日期类型列的问题;DATETIME类型的列处理正确,并返回DATETIME.DATETIME实例。

例子 结果:

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

这正常吗?我如何才能最好地更正它?

使用SQL Server本机客户端。e、 g.将驱动程序={SQLServer本机客户端10.0}放在连接字符串中,而不是 驱动程序={SQL Server}

使用SQL Server ODBC驱动程序以字符串形式返回日期,重现您的场景。使用SQL Server本机客户端的2008+兼容版本时,日期类型会按预期返回,但看起来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)
结果:

(('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))
(('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))
(('date',无,10,10,0,False),
('datetime',无,23,23,3,False),
('datetime2',无,27,27,0,假))

我刚刚用pyodbc和MSSQL 2008在Python 2.6中试用过它-它给了我一个datetime对象。@Artsiom是DATE或datetime类型的列?@Artsiom是的,这个问题似乎只影响日期列。我不能用DATE列检查这个问题,但告诉我一切都应该正常。无论如何,如果需要,您可以尝试使用datetime.strTime方法将字符串转换为datetime对象。我也遇到了这个问题。再次强调,特别是日期,而不是日期时间。太好了。。。现在,我只需要研究一下如何在Linux下做到这一点,在Linux下我使用unixODBC和freeTDS。。。看起来freeTDS在SQL 2005上不支持任何东西:较新版本的freeTDS支持日期和日期时间:freeTDS 0.95或更高版本支持日期和日期时间(签出)