0

0

使用pyodbc处理MS Access数据库中的时间数据类型:理解与提取

DDD

DDD

发布时间:2025-07-22 20:24:01

|

314人浏览过

|

来源于php中文网

原创

使用pyodbc处理ms access数据库中的时间数据类型:理解与提取

当使用pyodbc连接MS Access数据库并查询时间(TIME)字段时,返回的结果通常是包含日期部分的datetime.datetime对象,而非纯粹的HH:MM:SS格式。这是因为Access内部没有独立的TIME类型,而是将其存储为DateTime类型,并以1899年12月30日作为基准日期。用户可以通过Python的datetime对象方法或格式化来提取所需的HH:MM:SS时间部分。

Access时间字段的内部机制

Microsoft Access数据库中,并没有一个专门的“时间(TIME)”数据类型。所有与日期和时间相关的数据都统一存储为“日期/时间(DateTime)”类型。当用户在Access中定义一个看似只存储时间(例如TIME类型或只输入时间值)的字段时,Access会在内部为其分配一个默认的日期部分,这个默认日期就是1899年12月30日。因此,当pyodbc从Access数据库中读取这类字段时,它会忠实地返回一个完整的Python datetime.datetime对象,其中包含了Access内部使用的这个基准日期。

例如,如果Access中存储的时间是12:14:29,pyodbc会将其解析为datetime.datetime(1899, 12, 30, 12, 14, 29)。这种行为是符合预期的,因为pyodbc只是将数据库的原始数据类型映射到Python中对应的类型。

查询与结果示例

假设我们有以下MS Access数据库表结构和查询语句:

Insersion 表的DDL:

CREATE TABLE Insersion (
insersionID COUNTER PRIMARY KEY, 
date_inserted DATE, 
time_inserted TIME, 
floaterID INT, 
wholeID INT, 
FOREIGN KEY (floaterID) REFERENCES [Float] (floaterID), 
FOREIGN KEY (wholeID) REFERENCES [whole] (wholeID), 
conversionType VARCHAR(30))

SQL 查询语句:

SELECT [F].float, [I].time_inserted
FROM [Float] AS F, Insersion AS I
WHERE F.floaterID = I.floaterID;

当使用pyodbc执行上述查询时,Python代码如下:

Dbsite企业网站管理系统1.5.0
Dbsite企业网站管理系统1.5.0

Dbsite企业网站管理系统V1.5.0 秉承"大道至简 邦达天下"的设计理念,以灵巧、简单的架构模式构建本管理系统。可根据需求可配置多种类型数据库(当前压缩包支持Access).系统是对多年企业网站设计经验的总结。特别适合于中小型企业网站建设使用。压缩包内包含通用企业网站模板一套,可以用来了解系统标签和设计网站使用。QQ技术交流群:115197646 系统特点:1.数据与页

下载
import pyodbc
import datetime

# 假设 conn 已经是一个有效的 pyodbc 连接对象
# conn = pyodbc.connect('DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=your_database.accdb;')

cursor = conn.cursor()
query = """
SELECT [F].float, [I].time_inserted
FROM [Float] AS F, Insersion AS I
WHERE F.floaterID = I.floaterID;
"""
cursor.execute(query)

for row in cursor.fetchall():
     print(f"原始数据行: {row}")
     # 假设 time_inserted 是结果的第二个元素
     time_data = row[1] 
     print(f"time_inserted 字段类型: {type(time_data)}")
     print(f"time_inserted 字段值: {time_data}")

运行上述代码,time_data的输出将是类似datetime.datetime(1899, 12, 30, 12, 14, 29)这样的格式。

解决方案:提取所需时间部分

由于pyodbc返回的是标准的Python datetime.datetime对象,我们可以利用其内置的方法来轻松提取出纯粹的时间部分,或者将其格式化为所需的字符串。

1. 使用 .time() 方法

datetime.datetime对象有一个.time()方法,可以返回一个只包含时间信息的datetime.time对象。

import pyodbc
import datetime

# ... (pyodbc 连接和查询代码同上) ...

cursor.execute(query)
for row in cursor.fetchall():
     time_datetime_obj = row[1] # 获取 datetime.datetime 对象

     # 提取纯粹的时间对象
     time_obj = time_datetime_obj.time()
     print(f"提取后的时间对象: {time_obj} (类型: {type(time_obj)})")

     # 格式化为 HH:MM:SS 字符串
     formatted_time = time_obj.strftime("%H:%M:%S")
     print(f"格式化后的时间字符串: {formatted_time}")
     print("-" * 30)

输出示例:

原始数据行: (1.0, datetime.datetime(1899, 12, 30, 12, 14, 29))
time_inserted 字段类型: <class 'datetime.datetime'>
time_inserted 字段值: 1899-12-30 12:14:29
提取后的时间对象: 12:14:29 (类型: <class 'datetime.time'>)
格式化后的时间字符串: 12:14:29
------------------------------
原始数据行: (2.0, datetime.datetime(1899, 12, 30, 12, 16, 39))
time_inserted 字段类型: <class 'datetime.datetime'>
time_inserted 字段值: 1899-12-30 12:16:39
提取后的时间对象: 12:16:39 (类型: <class 'datetime.time'>)
格式化后的时间字符串: 12:16:39
------------------------------

2. 直接使用 strftime() 格式化

如果你只需要一个格式化的时间字符串,可以直接对datetime.datetime对象使用strftime()方法,并指定只提取时间部分的格式。

import pyodbc
import datetime

# ... (pyodbc 连接和查询代码同上) ...

cursor.execute(query)
for row in cursor.fetchall():
     time_datetime_obj = row[1] # 获取 datetime.datetime 对象

     # 直接格式化为 HH:MM:SS 字符串
     formatted_time = time_datetime_obj.strftime("%H:%M:%S")
     print(f"直接格式化后的时间字符串: {formatted_time}")
     print("-" * 30)

注意事项

  • Access的日期/时间存储机制:始终记住Access中没有纯粹的TIME类型。即使你在Access中只输入时间,它也会带上1899-12-30这个日期。
  • Python datetime对象的灵活性:datetime.datetime对象提供了丰富的属性和方法(如year, month, day, hour, minute, second, time(), strftime()等),可以根据需要灵活地处理日期和时间信息。
  • 避免硬编码日期:在处理从Access获取的时间数据时,不应假设或依赖1899年12月30日这个日期,因为这只是Access内部的实现细节。正确的做法是使用datetime对象的方法来提取或格式化所需的时间部分。
  • 性能考虑:对于大量数据,提取和格式化操作通常不会成为性能瓶颈,但如果对性能有极致要求,可以考虑在SQL查询层面就进行格式化(如果数据库支持,但Access的SQL功能相对有限,通常不如Python处理灵活)。

总结

当使用pyodbc从MS Access数据库中查询“时间”字段时,返回datetime.datetime对象并带有1899年12月30日这个基准日期是正常且预期的行为。这反映了Access内部统一使用DateTime类型存储所有日期和时间信息的机制。开发者只需在Python代码中利用datetime对象的.time()方法或strftime("%H:%M:%S")格式化功能,即可轻松提取并使用所需的HH:MM:SS时间部分,而无需关注其内部的基准日期。理解这一机制有助于更有效地处理Access数据库中的时间数据。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

1090

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

339

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

380

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1988

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

379

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

1540

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

585

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

438

2024.04.29

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

3

2026.03.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.7万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号