GROUP BY Django formato de data strftime

votos
14

Eu gostaria de fazer uma soma em linhas em um banco de dados e grupo por data.

Eu estou tentando executar essa consulta SQL usando agregados e anotações Django:

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

Eu tentei o seguinte:

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

mas parece que você só pode usar nomes de coluna nos valores () função; que não gosta do uso de strftime ().

Como devo fazer isso?

Publicado 06/04/2009 em 18:04
fonte usuário
Em outras línguas...                            


5 respostas

votos
15

Isso funciona para mim:

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

Demorou um pouco para descobrir que eu tinha que escapar os sinais%.

Respondeu 06/04/2009 em 20:45
fonte usuário

votos
2

A partir de v1.8, você pode usar (expressões Func) .

Por exemplo, se acontecer de você ser alvo funções de data e hora da 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

Em seguida, você pode usá-lo como este:

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

ou assim:

SomeDbModel.objects \
 .annotate(the_date=TimezoneConvertedDateF('some_timestamp_col_name',
                                           'America/New_York')) \
 .values('the_date') \
 .annotate(...)
Respondeu 09/07/2016 em 19:57
fonte usuário

votos
1

Eu não tenho certeza sobre strftime, minha solução abaixo está usando 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')

- igual a execução de consulta SQL:

selecionar date_trunc ( 'mês', CreationTime) como data, tone_name, sum (loadcount), soma (buycount), soma (cancelcount)
de webclickstat
grupo por tone_name, data;
Respondeu 17/03/2016 em 14:13
fonte usuário

votos
1

Qualquer razão para não apenas fazer isso no banco de dados, executando a seguinte consulta no banco de dados:

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

Se a sua resposta é, a data é uma data e hora com diferentes de zero horas, minutos, segundos, ou milissegundos, a minha resposta é a utilização de uma função de data para truncar a data e hora, mas não posso dizer exatamente o que é, sem saber o que RBDMS você está usando.

Respondeu 06/04/2009 em 18:12
fonte usuário

votos
0

minha solução como esta, quando o meu db é mysql:

select_data = {"date":"""FROM_UNIXTIME( action_time,'%%Y-%%m-%%d')"""} 
qs = ViewLogs.objects.filter().extra(select=select_data).values('mall_id', 'date').annotate(pv=Count('id'), uv=Count('visitor_id', distinct=True))

usar que funcionam, você pode ler documentos do processador datetime mysql como DATE_FORMAT, FROM_UNIXTIME ...

Respondeu 10/04/2018 em 03:52
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more