2010-10-18 35 views
1

Version abrégée: lorsque j'essaie d'utiliser la fonction DatePart d'Access via ODBC, elle ne peut pas être résolue.Utilisation d'opérateurs SQL Microsoft Access en Python ODBC

version plus longue:

J'ai une requête Microsoft Access qui renvoie des lignes avec un horodatage et un score. Je veux le trier par jour et ensuite par le score - effectivement un tableau des meilleurs scores pour la journée.

Faute d'une meilleure fonction, j'ai utilisé la fonction DatePart pour extraire chacun de l'année, du mois et du jour de l'horodatage, et ORDER BY suivi du score.

Dans Microsoft Access, la requête fonctionne à merveille.

Toutefois, lorsque j'utilise pyodbc pour accéder à la même requête, le pilote ODBC est tronqué par la fonction DatePart et pense qu'il s'agit du nom d'un paramètre manquant.

Ce qui m'a étonné est que même si je cachais la fonction DatePart, en créant une nouvelle requête de HighScore, puis SELECT * FROM HighScore, il encore qu'il se plaint n'a pas pu trouver le paramètre. Apparemment, le SQL de la requête est en train d'être résolu assez tard dans le processus.

Ma question est:

  • Comment puis-je résoudre la fonction DatePart dans le SQL pour permettre l'accès à l'exécuter, ou
  • Quelle est une bonne façon de trier par la partie de jour d'un horodatage sur ODBC?

Ajouté Informations complémentaires:

On dirait surpuissant, mais voici un code:

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." 

Voici les résultats:

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)') 
+1

Vous devrez fournir du code source et les messages d'erreur exacts que vous avez reçus de pyodbc. –

Répondre

2

Êtes-vous sûr que l'utilisation des guillemets "yyyy" au lieu d'apostrophes 'yyyy' est valide dans ce dialecte de SQL?

+0

Merci. Exactement le problème. – Oddthinking

2

Les datetime sont stockées dans l'accès sous forme de nombres à virgule flottante. Le nombre à gauche de la virgule décimale est la date, la partie décimale à droite de la virgule décimale est l'heure (exprimée en termes de fraction de journée, c'est-à-dire .5 = midi).

Si vous souhaitez effectuer un tri par jour, vous pouvez simplement utiliser la fonction Int() pour renvoyer la partie entière du champ datetime.

+0

Super à savoir. Je peux revenir à cela pour rendre le code plus simple. Merci. – Oddthinking

+0

En plus de le rendre plus simple, il devrait également le rendre beaucoup plus rapide. – mwolfe02