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

在Python ODBC中使用Microsoft Access SQL运算符,python,sql,ms-access,odbc,pyodbc,Python,Sql,Ms Access,Odbc,Pyodbc,简短版本:当我试图通过ODBC使用Access的DatePart函数时,它无法解决 较长版本: 我有一个Microsoft Access查询,它返回带有时间戳和分数的行。我想按天排序,然后按分数排序——这实际上是一个当天的高分表 由于缺少更好的函数,我使用了DatePart函数从时间戳中提取年、月和日,然后按orderby和Score排序 在microsoftaccess中,查询工作得很好 但是,当我使用pyodbc访问同一查询时,ODBC驱动程序被DatePart函数难住了,并认为它是缺少的参

简短版本:当我试图通过ODBC使用Access的DatePart函数时,它无法解决

较长版本:

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

由于缺少更好的函数,我使用了
DatePart
函数从时间戳中提取年、月和日,然后按
orderby
和Score排序

在microsoftaccess中,查询工作得很好

但是,当我使用
pyodbc
访问同一查询时,ODBC驱动程序被DatePart函数难住了,并认为它是缺少的参数的名称

令我惊讶的是,即使我通过创建一个新的HighScore查询隐藏了DatePart函数,然后从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."
导入pyodbc
访问\u db\u路径=r“”
连接字符串='驱动程序={Microsoft Access驱动程序(*.mdb,*.accdb)};DBQ='+access\u db\u路径
connection=pyodbc.connect(连接字符串,autocommit=True)
打印“第一次查询”
connection.cursor().execute('SELECT ScoreTime FROM SplitExtendedP1')
打印“已工作”
打印“第二次查询”
打印connection.cursor().execute('从SplitExtendedP1'中选择DatePart(“yyyy”,ScoreTime))
打印“无法到达此处”
结果如下:

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)')
第一次查询
工作
第二个问题
回溯(最近一次呼叫最后一次):
文件“.py”,第16行,在
打印connection.cursor().execute('从SplitExtendedP1'中选择DatePart(“yyyy”,ScoreTime))
pyodbc。错误:('07002','[07002][Microsoft][ODBC Microsoft Access驱动程序]参数太少。应为1。(-3010)(SQLExecDirectW))

您确定使用引号
“yyyy”
而不是撇号
'yyyy'
在该SQL方言中有效吗?

您确定使用引号
“yyyy”
而不是撇号
'yyyy'
在该SQL方言中有效吗?

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


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

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


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

您需要提供一些源代码以及从pyodbc获得的准确错误消息。您需要提供一些源代码以及从pyodbc获得的准确错误消息。谢谢。正是问题所在,谢谢。正是问题所在。很高兴知道。我可以回到这一点,使代码更简单。谢谢。除了让它更简单,它还应该让它更快。很高兴知道。我可以回到这一点,使代码更简单。谢谢。除了使它更简单之外,它还应该使它更快。