Pyodbc没有返回精确的日期时间数据

时间:2015-12-03 18:50:41

标签: python sql datetime ms-access pyodbc

我在Python 3.4.3中使用pyodbc从Microsoft Access数据库(.mdb)读取数据。我用来提取时间戳的查询几乎正常 - 我得到了正确的日期和小时/分钟/秒数据,但数据库包含精确到百分之一秒的时间。我的时间戳似乎回来了。有谁知道我怎么能得到一秒钟的分数?

代码

t = cursor.execute('SELECT Time FROM ConditionData')

for record in t:
    print(record)

输出:

(datetime.datetime(2013, 7, 27, 8, 24, 54), )
(datetime.datetime(2013, 7, 27, 8, 27, 48), )
(datetime.datetime(2013, 7, 27, 8, 28, 1), )
(datetime.datetime(2013, 7, 27, 8, 29, 29), )
(datetime.datetime(2013, 7, 27, 8, 32, 44), )

实际时间戳(未截断的秒数):

7/27/2013 8:24:54.27
7/27/2013 8:27:48.95
7/27/2013 8:28:01.97
7/27/2013 8:29:29.12
7/27/2013 8:32:44.40

1 个答案:

答案 0 :(得分:1)

Access中的日期/时间列具有一秒的标称分辨率,并且Access ODBC驱动程序将在从其内部表示(Double)转换日期/时间值时丢弃小数秒。因此,例如,如果我们在SQL Server表的datetime列中具有以下值

2014-08-12 01:02:03.670

我们在Access

中的ODBC链接表上执行以下查询
import pyodbc

connStr = (
    r"Driver={Microsoft Access Driver (*.mdb, *.accdb)};"
    r"DBQ=C:\Users\Public\Database1.accdb;"
    )
cnxn = pyodbc.connect(connStr)
crsr = cnxn.cursor()

sql = """\
SELECT [Time] FROM ConditionData WHERE ID=1
"""
crsr.execute(sql)
row = crsr.fetchone()
mydatetime = row[0]

print(repr(mydatetime))
print(mydatetime)

crsr.close()
cnxn.close()

我们看到了

datetime.datetime(2014, 8, 12, 1, 2, 3)
2014-08-12 01:02:03

但是,如果我们调整查询并使用CDbl()函数返回基础Double值,那么我们可以将其转换为datetime并保留小数秒,如下所示:

from datetime import datetime, timedelta
import math
import pyodbc

def VT_DATE_double_to_datetime(dbl):
    # math.modf() returns (<fractional_part>, <integer_part>)
    day_parts = math.modf(dbl)
    return (
        datetime(1899, 12, 30) +
        timedelta(days=day_parts[1]) +
        timedelta(seconds=abs(day_parts[0]) * 86400)
        )


connStr = (
    r"Driver={Microsoft Access Driver (*.mdb, *.accdb)};"
    r"DBQ=C:\Users\Public\Database1.accdb;"
    )
cnxn = pyodbc.connect(connStr)
crsr = cnxn.cursor()

sql = """\
SELECT CDbl([Time]) AS ddbl FROM ConditionData WHERE ID=1
"""
crsr.execute(sql)
row = crsr.fetchone()
mydatetime = VT_DATE_double_to_datetime(row[0])

print(repr(mydatetime))
print(mydatetime)

crsr.close()
cnxn.close()

给了我们

datetime.datetime(2014, 8, 12, 1, 2, 3, 670000)
2014-08-12 01:02:03.670000