短いバージョン:ODBCを介してAccessのDatePart関数を使用しようとすると、解決できません。
長いバージョン:
タイムスタンプとスコアを含む行を返すMicrosoftAccessクエリがあります。日ごとに、次にスコアごとに並べ替えたいと思います。事実上、その日のハイスコアテーブルです。
より良い関数が必要な場合は、この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)')