2013-04-09 15 views
7

Czy ktoś wie, w jaki sposób mogę sortować (w tym przypadku datę) moje zapytanie django ustawione na dzisiejszą datę?Jak sortować zestaw kwerend Django przed datą dzisiejszą?

class Person(models.Model): 
    name = models.CharField(max_length=50) 
    date = models.DateField() 

Moim celem jest podanie nazwy i daty. U góry listy znajduje się pozycja z datą najbliższą dzisiejszej randce (dzień/miesiąc).

+1

Co oznacza "sortować przeciwko"? Możesz sortować według daty ze zwykłym '.order_by ('date')'. –

+0

@PavelAnossov Chyba ma na myśli '[dzisiaj, 2 dni temu, 3 dni w przyszłości, 4 dni temu, ...]' - sortować względem dzisiejszego – karthikr

+0

czy możesz podać przykładowe wyjście? – catherine

Odpowiedz

6

Można użyć extra metodę queryset aby wybrać dodatkowe dane z tabeli bazy danych.

To jest przykład, który współpracuje z MySQL:

Person.objects.extra(select={ 
    'datediff': 'ABS(DATEDIFF(date, NOW()))'}).order_by('datediff') 

DateDiff - zwraca różnicę w dniach bewteen dwiema datami, ABS - zwraca wartość bezwzględną. W przypadku sqlite istnieje inna składnia, zobacz tę answer.

EDIT: zużywają prąd roku

Person.objects.extra(select={ 
    'datediff': "ABS(DATEDIFF(CONCAT(YEAR(now()), '-', MONTH(date), '-', DAY(date)), NOW()))"} 
).order_by('datediff') 

EDIT 2: zoptymalizowany *

from datetime import date 
dayofyear = int(date.today().strftime("%j")) 

datediff = 'LEAST(ABS(DAYOFYEAR(date) - %d), ABS((366 - %d + DAYOFYEAR(date))) MOD 366)' % (
     dayofyear, dayofyear 
    ) 
Person.objects.extra(select={'datediff': datediff}).order_by('datediff') 

EDIT 3: najbliższa data po podano (dzisiejsza) data

from datetime import date 
    dayofyear = int(date.today().strftime("%j")) 

    datediff = '(DAYOFYEAR(date) - %d + 365) MOD 365' % (
      dayofyear 
     ) 
    Persion.objects.extra(select={'datediff': datediff}).order_by('datediff') 
+0

Dzięki, myślę, że działałoby, gdybym mógł wykonać to zapytanie, ale bez roku, tj. Najbliższy dzień/miesiąc do bieżącej daty. – felix001

+0

Co masz na myśli mówiąc "ale bez roku" - masz na myśli, że 04-15-1999 nadejdzie przed 04-01-2013 (z założeniem, że aktualna data to 04-15-2013.) – bmihelac

+0

Więc jeśli masz 12 -4-1980 i 1-4-1991, a data była 9-4-2013, a następnie 12-4-1980 było na pierwszym miejscu. tzn. chcę sortować daty tylko z użyciem miesiąca i dnia, ponieważ każda z nich będzie używana jako data urodzin. Więc chcę zobaczyć najbliższe urodziny. – felix001

0

Jeśli chcesz sortować na podstawie daty, można zamówić jako: .order_by('date') na queryset wynikowej.

Nie jestem pewien, czy to odpowie na twoje pytanie. W przypadku, to znaczy, że chce wybrać tylko osobom z dnia dzisiejszego, można użyć:

import datetime 
now = datetime.datetime.now() 
persons_with_date_today = Person.objects.filter(date=now) 
+0

To filtruje wyniki, OP musi go posortować na podstawie dzisiejszej daty. – karthikr

+0

Wiem, na to też odpowiedziałem, ale z powodu niejasności w brzmieniu PO dodałem również wyjaśnienie na wypadek, gdyby potrzebował filtrowania. – Javaaaa

+0

Pytanie brzmi: posortuj według rosnącej różnicy w znaczniku czasu względem teraz: – karthikr

Powiązane problemy