2009-04-06 15 views
14

Mi piacerebbe fare una SOMMA su righe in un database e raggruppare per data.GRUPPO Django per formato data strftime

Sto cercando di eseguire questa query SQL utilizzando Django aggregati e annotazioni:

select strftime('%m/%d/%Y', time_stamp) as the_date, sum(numbers_data) 
    from my_model 
    group by the_date; 

ho provato la seguente:

data = My_Model.objects.values("strftime('%m/%d/%Y', 
      time_stamp)").annotate(Sum("numbers_data")).order_by() 

ma sembra che è possibile utilizzare solo i nomi delle colonne nei valori() funzione; non gli piace l'uso di strftime().

Come devo fare questo?

+0

Ho appena trovato questo: http://code.djopoproject.com/ticket/10302 –

risposta

14

questo funziona per me:

select_data = {"d": """strftime('%%m/%%d/%%Y', time_stamp)"""} 

data = My_Model.objects.extra(select=select_data).values('d').annotate(Sum("numbers_data")).order_by() 

voluto un po 'per capire che dovevo scappare i segni%.

+0

Ho qualcosa di simile: 'Out [15]: ) non riuscito: django.db.utils.OperationalError: (1305, 'FUNCTION xxxxxx.strftime non esiste ')> ' qualche idea perché? – user2002692

+0

Sto ottenendo lo stesso errore. Hai scoperto perché non è riuscito a riconoscere lo strftime? – Sid

1

Qual è il motivo di non fare proprio questo nel database, eseguendo la seguente query sul database:

select date, sum(numbers_data) 
from my_model 
group by date; 

Se la risposta è, la data è un datetime con non-zero ore, minuti, secondi , o millisecondi, la mia risposta è usare una funzione di data per troncare il datetime, ma non posso dirti esattamente di cosa si tratta senza sapere quale RBDMS stai usando.

+0

In questo momento sto usando solo sqlite3 per la prova di co ncept. La "data" è infatti un campo datetime. Stavo usando strftime() per troncare il campo datetime ad una data. C'è qualcosa di meglio per sqlite3? Cosa intendi con "fai questo nel database"? Grazie! –

+0

Voglio dire, basta usare qualsiasi funzione che esista in Django per fare una selezione SQL diretta. – tpdi

1

io non sono sicuro di strftime, la mia soluzione qui di seguito sta usando Postgres SQL trunc ...

select_data = {"date": "date_trunc('day', creationtime)"}  
ttl = ReportWebclick.objects.using('cms')\ 
        .extra(select=select_data)\ 
        .filter(**filters)\ 
        .values('date', 'tone_name', 'singer', 'parthner', 'price', 'period')\ 
        .annotate(loadcount=Sum('loadcount'), buycount=Sum('buycount'), cancelcount=Sum('cancelcount'))\ 
        .order_by('date', 'parthner') 

- pari a esecuzione di query SQL:

 
select date_trunc('month', creationtime) as date, tone_name, sum(loadcount), sum(buycount), sum(cancelcount) 
from webclickstat 
group by tone_name, date; 
2

Come di v1.8 , puoi usare Func() expressions.

Ad esempio, se vi capita di essere mira di data e ora funzioni di AWS Redshift:

from django.db.models import F, Func, Value 

def TimezoneConvertedDateF(field_name, tz_name): 
    tz_fn = Func(Value(tz_name), F(field_name), function='CONVERT_TIMEZONE') 
    dt_fn = Func(tz_fn, function='TRUNC') 
    return dt_fn 

quindi è possibile utilizzare in questo modo:

SomeDbModel.objects \ 
.annotate(the_date=TimezoneConvertedDateF('some_timestamp_col_name', 
              'America/New_York')) \ 
.filter(the_date=...) 

o come questo:

SomeDbModel.objects \ 
.annotate(the_date=TimezoneConvertedDateF('some_timestamp_col_name', 
              'America/New_York')) \ 
.values('the_date') \ 
.annotate(...)