2009-04-06 25 views
14

Tôi muốn thực hiện SUM trên các hàng trong cơ sở dữ liệu và nhóm theo ngày.Django GROUP THEO định dạng ngày đi nghỉ

Tôi cố gắng để chạy truy vấn SQL này sử dụng uẩn Django và chú thích:

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

tôi thử như sau:

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

nhưng nó có vẻ như bạn chỉ có thể sử dụng tên cột trong các giá trị() chức năng; nó không thích sử dụng strftime().

Tôi nên làm như thế nào?

+0

Chỉ tìm thấy điều này: http://code.djangoproject.com/ticket/10302 –

Trả lời

14

này làm việc cho tôi:

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

Took một chút để tìm ra tôi phải thoát khỏi những dấu hiệu%.

+0

Tôi có một cái gì đó như: 'Ra [15]: ) không thành công: django.db.utils.OperationalError: (1305, 'FUNCTION xxxxxx.strftime không tồn tại ')> ' bất kỳ ý tưởng nào tại sao? – user2002692

+0

Tôi nhận được lỗi tương tự. Bạn đã tìm ra lý do tại sao nó không thể nhận ra strftime? – Sid

1

Bất kỳ lý do để không chỉ làm điều này trong cơ sở dữ liệu, bằng cách chạy các truy vấn sau đây đối với cơ sở dữ liệu:

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

Nếu câu trả lời là, ngày này là một datetime với non-zero giờ, phút, giây , hoặc mili giây, câu trả lời của tôi là sử dụng hàm ngày để cắt bớt ngày giờ, nhưng tôi không thể cho bạn biết chính xác những gì mà không biết RBDMS bạn đang sử dụng.

+0

Ngay bây giờ tôi chỉ sử dụng sqlite3 cho bằng chứng về đồng ncept. "Ngày" thực sự là trường ngày giờ. Tôi đã sử dụng strftime() để cắt bớt trường datetime thành một ngày. Có điều gì tốt hơn cho sqlite3? Bạn có ý gì bởi "chỉ cần làm điều này trong cơ sở dữ liệu"? Cảm ơn! –

+0

Tôi có nghĩa là, chỉ cần sử dụng bất cứ cơ sở exisyts trong Django để thực hiện một sql thẳng chọn. – tpdi

1

Tôi không chắc chắn về strftime, giải pháp của tôi dưới đây được sử dụng 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') 

- tương đương với thực hiện truy vấn sql:

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

Tính đến v1.8 , bạn có thể sử dụng Func() expressions.

Ví dụ, nếu bạn tình cờ được nhắm mục tiêu theo ngày và thời gian chức năng AWS chuyển đỏ của:

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 

Sau đó, bạn có thể sử dụng nó như thế này:

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

hay như thế này:

SomeDbModel.objects \ 
.annotate(the_date=TimezoneConvertedDateF('some_timestamp_col_name', 
              'America/New_York')) \ 
.values('the_date') \ 
.annotate(...) 
Các vấn đề liên quan