pyodbc返回SQL Server日期字段为字符串

7 投票
1 回答
10658 浏览
提问于 2025-04-17 00:15

我正在使用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))

撰写回答