2013-04-09 7 views
7

Qualcuno sa come posso ordinare (in questa data di esempio) la mia query di django contro la data odierna?Come si ordina il set di query Django rispetto alla data odierna?

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

Il mio obiettivo è elencare il nome e le voci della data. Nella parte superiore dell'elenco sarà la voce con la data più vicina alla data di oggi (giorno/mese).

+1

Che cosa significa "ordinare contro"? È possibile ordinare per data con ordinario '.order_by ('date')'. –

+0

@PavelAnossov Immagino che intenda '[oggi, 2 giorni fa, 3 giorni in futuro, 4 giorni fa, ...]' - ordinamento relativo a oggi – karthikr

+0

puoi fornire un campione di output – catherine

risposta

6

È possibile utilizzare il metodo extra set di query per selezionare i dati aggiuntivi da tabella di database.

Questo è l'esempio che funziona con MySql:

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

DATEDIFF - restituisce differenza in giorni bewteen due date, ABS - restituisce valore assoluto. Per sqlite, esiste una sintassi diversa, vedere questo answer.

EDIT: usare corso

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

EDIT 2: ottimizzato *

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: data più vicina dopo la data (oggi) 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

Grazie, penso che funzionerebbe se potessi eseguire questa query ma senza l'anno il giorno/mese più vicino alla data corrente. – felix001

+0

Cosa intendi con "ma senza l'anno" - intendi che il 04-15-1999 arriverà prima del 04-01-2013 (con l'ipotesi che la data corrente sia il 04-15-2013). – bmihelac

+0

Quindi se hai 12 anni -4-1980 e 1-4-1991 e la data era il 9-4-2013, quindi il 12-4-1980 sarebbe arrivato per primo. io voglio solo ordinare le date usando il mese e il giorno in quanto ciascuna sarà usata come data del compleanno. Quindi voglio vedere il compleanno più vicino. – felix001

0

Se si desidera ordinare in base alla data, è possibile ordinare come: .order_by('date') su un queryset del risultato.

Non sono sicuro che questo risponda alla tua domanda. Nel caso in cui si intende che si desidera selezionare solo le persone con la data di oggi, è possibile utilizzare:

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

Questo sta filtrando i risultati, l'OP ha bisogno di ordinarlo in base alla data di oggi – karthikr

+0

Lo so, questo è quello che ho anche risposto - ma a causa dell'ambiguità nella formulazione dell'OP ho anche aggiunto una spiegazione nel caso in cui avesse bisogno di un filtro. – Javaaaa

+0

La domanda è, ordina in ordine crescente di differenza in timestamp rispetto a ora – karthikr

Problemi correlati