2008-10-19 8 views

Répondre

0

Je ne connais pas SQLAlchemy, donc je pourrais être hors cible. Cependant, je pense que tout ce que vous avez besoin est:

SELECT date_formatter(datetime_field, "format-specification") AS dt_field, COUNT(*) 
    FROM logs 
    GROUP BY date_formatter(datetime_field, "format-specification") 
    ORDER BY 1; 

OK, ce serait peut-être vous n'avez pas besoin ORDER BY, et peut-être préférable de repréciser l'expression de date. Il existe probablement des alternatives, telles que:

SELECT dt_field, COUNT(*) 
    FROM (SELECT date_formatter(datetime_field, "format-specification") AS dt_field 
       FROM logs) AS necessary 
    GROUP BY dt_field 
    ORDER BY dt_field; 

Et ainsi de suite. Fondamentalement, vous formatez le champ datetime, puis continuez à faire le groupement etc sur la valeur formatée.

1

Le comptage donne-t-il le même résultat lorsque vous venez d'être groupé par la colonne datetime non formatée? Si c'est le cas, vous pouvez simplement lancer la requête et utiliser ensuite la méthode strftime() de Python date. à savoir

query = select([logs.c.datetime, func.count(logs.c.datetime)]).group_by(logs.c.datetime) 
results = session.execute(query).fetchall() 
results = [(t[0].strftime("..."), t[1]) for t in results] 
4

Je ne sais pas d'une réponse SQLAlchemy générique. La plupart des bases de données prennent en charge une forme de mise en forme de date, généralement via des fonctions. SQLAlchemy prend en charge les fonctions d'appel via sqlalchemy.sql.func. Ainsi, par exemple, en utilisant SQLAlchemy sur une Postgres extrémité arrière et une my_table de table (foo varchar (30), lorsque l'horodatage) je pourrais faire quelque chose comme

my_table = metadata.tables['my_table'] 
foo = my_table.c['foo'] 
the_date = func.date_trunc('month', my_table.c['when']) 
stmt = select(foo, the_date).group_by(the_date) 
engine.execute(stmt) 

Pour groupe par date tronquée au mois. Mais gardez à l'esprit que dans cet exemple, date_trunc() est une fonction datetime Postgres. Les autres bases de données seront différentes. Vous n'avez pas mentionné la base de données underlyig. S'il existe une base de données indépendante, je n'en ai jamais trouvé. Dans mon cas, j'exécute la production et le test de Postgres et de tests unitaires avec SQLite et j'ai utilisé des fonctions définies par l'utilisateur SQLite dans mes tests unitaires pour émuler les fonctions de date et heure de Postgress.

+0

Précisément ce dont j'avais besoin .. maintenant sur le manuel SQLite pour trouver la fonction tronquée! Je pense que c'est "STRFTIME ('% Y-% m', quand)" dans mon cas. –