2009-04-06 2 views
14

Я хотел бы сделать SUM по строкам в базе данных и по дате.Django GROUP BY strftime date format

Я пытаюсь запустить этот SQL запрос с использованием Django агрегатов и аннотации:

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

Я попробовал следующее:

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

, но кажется, что вы можете использовать только имена столбцов в значениях(); ему не нравится использование strftime().

Как мне это сделать?

+0

Только что нашел это: http://code.djangoproject.com/ticket/10302 –

ответ

14

Это работает для меня:

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() 

Взял немного, чтобы понять, что я должен был избежать знаки%.

+0

У меня есть что-то вроде: 'Out [15]: ) не удалось: django.db.utils.OperationalError: (1305, 'FUNCTION xxxxxx.strftime не существуют ')> ' любые идеи, почему? – user2002692

+0

У меня такая же ошибка. Вы узнали, почему он не мог распознать strftime? – Sid

1

Любая причина, чтобы не только сделать это в базе данных, выполнив следующий запрос к базе данных:

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

Если ваш ответ, дата является DateTime с ненулевыми часы, минуты, секунды , или миллисекунды, мой ответ заключается в использовании функции даты для усечения даты и времени, но я не могу точно сказать, что это такое, не зная, какую RBDMS вы используете.

+0

Сейчас я просто использую sqlite3 для подтверждения co ncept. «Дата» действительно поле даты. Я использовал strftime() для усечения поля datetime в дату. Что-то лучше для sqlite3? Что вы подразумеваете под «просто сделать это в базе данных»? Благодаря! –

+0

Я имею в виду, просто используйте любые возможности exisyts в Django, чтобы сделать прямой выбор sql. – tpdi

1

Я не уверен STRFTIME, мое решение ниже использует SQL Postgres 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') 

- равно выполнение SQL-запроса:

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

По состоянию на v1.8 , вы можете использовать Func() expressions.

Например, если вам случится быть нацеливание функции даты и времени 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 

Затем вы можете использовать его как это:

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

или как это:

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