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

时间:2010-10-18 05:31:38

标签: python sql ms-access odbc pyodbc

简短版本:当我尝试通过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 个答案:

答案 0 :(得分:2)

您确定使用引号"yyyy"而不是撇号'yyyy'在SQL的方言中是否有效?

答案 1 :(得分:2)

日期时间作为浮点数存储在访问中。小数点左边的数字是日期,小数点右边的小数部分是时间(用一天的一小部分表示;即.5 =中午)。

如果要按日排序,只需使用Int()函数返回datetime字段的整数部分即可。