2009-04-06 3 views
14

데이터베이스의 행과 날짜별로 SUM을 수행하고 싶습니다.Django GROUP BY strftime 날짜 형식

는 내가 장고 단위 및 주석을 사용하여이 SQL 쿼리를 실행하려고

:

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

하지만 당신은 단지 값의 열 이름을 사용할 수 있습니다처럼 보인다 :

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

나는 다음과 같은 시도() 함수; 그것은 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을 사용하고 있습니다. ncept. "날짜"는 실제로 datetime 필드입니다. datetime 필드를 날짜로 잘라내 기 위해 strftime()을 사용하고있었습니다. sqlite3에 더 좋은 점이 있습니까? "데이터베이스에서이 작업을 수행하십시오"라는 것은 무엇을 의미합니까? 감사! –

+0

Django에있는 모든 기능을 사용하여 SQL을 직접 선택할 수 있습니다. – tpdi

1

나는 ... 아래에있는 내 솔루션은 SQL 포스트 그레스 TRUNC를 사용하고,의 strftime에 대해 확실하지 않다

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 쿼리 실행과 동일 : V1.8의로

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

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