2010-01-21 7 views

Répondre

9

Si je me souviens bien, vous devez d'abord extraire l'heure de votre horodatage et vous pouvez alors le groupe par là.

query(extract('hour', timeStamp).label('h')).group_by('h') 
+2

Cela a fonctionné quand j'ai mis des citations sur l'heure. – Dave

+0

Oups ... oui, vous aurez besoin de faire cela. J'ai mis à jour mon exemple. Merci d'avoir attrapé ça. – Scott

10

Cela fonctionne pour PostgreSQL:

.group_by(func.date_trunc('hour', date_col)) 
+0

Je n'ai pas mentionné que j'utilise sqlite; date_trunc est postgres? – Dave

-2

Vous pouvez également le faire en Python. En supposant que vous avez un ordre query_result:

from itertools import groupby 

def grouper(item): 
    return item.created.hour 
for (hour, items) in groupby(query_result, grouper): 
    for item in items: 
     # do stuff 

Cette réponse est adaptée d'une réponse à une question similaire here

0

Récemment je devais faire une chose similaire en utilisant sqlalchemy et MySQL et a fini par utiliser DATE_FORMAT (http://www.w3schools.com/sql/func_date_format.asp) à groupe par heure, minute, seconde

.group_by(func.date_format(date_col, '%H:%i:%s')) 

pour seul groupe par heure, il serait '%H' au lieu de '%H:%I:%s'

1

Dans Oracle, utilisez func.trunc(MyTable.dt, 'HH')

C'est un peu compliqué, cependant. Cela échoue:

q = session.query(func.trunc(MyTable.dt, 'HH'), func.sum(MyTable.qty) \ 
      .group_by(func.trunc(MyTable.dt, 'HH')) 

Mais cela réussit:

trunc_date = func.trunc(MyTable.dt, 'HH') 
q = session.query(trunc_date, func.sum(MyTable.qty) \ 
      .group_by(trunc_date) 

Merci à this thread pour la pointe.