Формат даты Django GROUP BY strftime
Я хотел бы сделать SUM по строкам в базе данных и по дате.
Я пытаюсь запустить этот 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()
но кажется, что вы можете использовать имена столбцов только в функции values (); ему не нравится использование strftime().
Как мне это сделать?
Ответы
Ответ 1
Это работает для меня:
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()
Взял немного, чтобы понять, что мне пришлось скрывать знаки%.
Ответ 2
Начиная с версии 1.8, вы можете использовать выражения Func().
Например, если вы планируете использовать функции даты и времени 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(...)
Ответ 3
Любая причина не просто делать это в базе данных, выполнив следующий запрос к базе данных:
select date, sum(numbers_data)
from my_model
group by date;
Если ваш ответ таков: дата - это дата-время с ненулевыми часами, минутами, секундами или миллисекундами, мой ответ заключается в использовании функции даты для усечения даты и времени, но я не могу точно сказать, что это такое не зная, какую RBDMS вы используете.
Ответ 4
Я не уверен в 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;