我在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
答案 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