在Python ODBC中使用Microsoft Access SQL运算符

1 投票
2 回答
4221 浏览
提问于 2025-04-16 05:39

简短版本:我在通过ODBC使用Access的DatePart函数时遇到了问题,它无法被识别。

详细版本:

我有一个Microsoft Access的查询,它返回带有时间戳和分数的行。我想按日期排序,然后再按分数排序——实际上就是一天的高分榜。

由于没有更好的函数,我使用了DatePart函数来从时间戳中提取年份、月份和日期,然后用ORDER BY对它们进行排序,接着是分数。

在Microsoft Access中,这个查询运行得非常顺利。

然而,当我使用pyodbc来访问同样的查询时,ODBC驱动程序对DatePart函数感到困惑,认为它是一个缺失参数的名称。

让我感到惊讶的是,即使我隐藏了DatePart函数,通过创建一个新的HighScore查询,然后用SELECT * FROM HighScore,它仍然抱怨找不到这个参数。显然,查询的SQL在处理过程中被解析得比较晚。

我的问题是:

  • 我该如何在SQL中解决DatePart函数,以便Access能够运行它,或者
  • 通过ODBC按时间戳的日期部分排序的正确方法是什么?

附加信息:

这看起来有点复杂,但这里有一些代码:

import pyodbc
access_db_path = r"<ellided>"
connection_string = 'Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ='+access_db_path
connection = pyodbc.connect(connection_string, autocommit = True)

print "First query"
connection.cursor().execute('SELECT ScoreTime FROM SplitExtendedP1')
print "Worked"

print "Second query"
print connection.cursor().execute('SELECT DatePart("yyyy",ScoreTime) FROM SplitExtendedP1')
print "Doesn't get here."

以下是结果:

First query
Worked
Second query
Traceback (most recent call last):
  File "<ellided>.py", line 16, in <module>
    print connection.cursor().execute('SELECT DatePart("yyyy", ScoreTime) FROM SplitExtendedP1')
pyodbc.Error: ('07002', '[07002] [Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 1. (-3010) (SQLExecDirectW)')

2 个回答

2

在Access数据库中,日期和时间是以浮点数的形式存储的。小数点左边的数字代表日期,而小数点右边的部分则表示时间(这个时间是以一天的分数来表示的;比如,.5 就代表中午12点)。

如果你想按照日期进行排序,可以直接使用Int()函数,这个函数会返回日期时间字段的小数点左边的整数部分。

2

你确定在那个SQL方言中,用双引号"yyyy"代替单引号'yyyy'是有效的吗?

撰写回答