pyodbc devuelve los campos DATE de SQL Server como cadenas

Estoy usando pyodbc para consultar una tabla de base de datos de SQL Server 2008 con columnas de tipo DATE.

Las filas de datos resultantes contienen cadenas de fecha en lugar de instancias de datetime.date o datetime.datetime de python.

Esto solo parece ser un problema para las columnas de tipo FECHA; las columnas de tipo DATETIME se manejan correctamente y devuelven una instancia de datetime.datetime.

Ejemplo

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) 

Resultados:

 (('id', , None, 10, 10, 0, False), ('name', , None, 23, 23, 0, False), ('some_date', , None, 10, 10, 0, True), ('write_time', , None, 23, 23, 3, False)) 

Tenga en cuenta que la columna some_date se indica como cadena de tipo Unicode, sin embargo, en la base de datos esta columna se define como DATE:

 CREATE TABLE dbo.Contract( id INT NOT NULL, name VARCHAR(23) NOT NULL, some_date DATE NULL, write_time DATETIME NOT NULL) 

¿Es esto normal y cómo puedo corregirlo mejor?

Utilice el cliente nativo de SQL Server. por ejemplo, ponga el controlador = {SQL Server Native Client 10.0} en su cadena de conexión, en lugar de DRIVER = {SQL Server} .

Reproduce tu escenario con la fecha que se devuelve como cadena usando el controlador ODBC de SQL Server. Cuando se usa una versión compatible con 2008+ del cliente nativo de SQL Server, el tipo de fecha se devuelve como se esperaba, pero parece que datetime2 se devuelve como una cadena (en mis pruebas limitadas).

Definición de la tabla:

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

Ejemplo:

 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) 

Resultados:

 (('date', , None, 10, 10, 0, False), ('datetime', , None, 23, 23, 3, False), ('datetime2', , None, 27, 27, 0, False))