2013-04-09 1 views
7

Weiß jemand, wie ich meine Django-Abfrage (heute Datum) nach heutigem Datum sortieren kann?Wie sortiere ich meinen Django Query Set gegen das heutige Datum?

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

Mein Ziel ist es, die Namen und Datumseinträge aufzulisten. Ganz oben in der Liste befindet sich der Eintrag mit dem Datum, das dem heutigen Datum am nächsten kommt (Tag/Monat).

+1

Was bedeutet "gegen sortieren"? Sie können nach Datum mit gewöhnlichem '.order_by ('date')' sortieren. –

+0

@PavelAnossov Ich denke, er meint '[heute, vor 2 Tagen, 3 Tagen in der Zukunft, vor 4 Tagen, ...]' - relativ zum heutigen Tag sortieren – karthikr

+0

können Sie eine Beispielausgabe liefern – catherine

Antwort

6

können Sie extra queryset Methode verwenden, um zusätzliche Daten aus Datenbanktabelle auswählen.

Dies ist Beispiel, das mit MySql funktioniert:

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

DATEDIFF - gibt Differenz in Tagen bewteen zwei Daten, ABS - kehrt Absolutwert. Für SQLite gibt es eine andere Syntax, siehe answer.

EDIT: Verwenden Sie aktuelle Jahr

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

EDIT 2: optimiert *

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: am nächsten Tag nach gegeben (heutigen) Datum

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

Danke, ich denke, das würde funktionieren, wenn ich diese Abfrage durchführen könnte, aber ohne das Jahr, d. H. Den nächsten Tag/Monat, der dem aktuellen Datum am nächsten ist. – felix001

+0

Was meinst du mit "aber ohne das Jahr" - meinst du, dass 04-15-1999 vor dem 04-01-2013 kommen würde (mit der Annahme, dass das aktuelle Datum der 15.04.2013 ist) – bmihelac

+0

Also wenn du 12 hast -4-1980 und 1-4-1991 und das Datum war 9-4-2013 dann 12-4-1980 würde zuerst kommen. d. h. ich möchte nur die Daten mit dem Monat und dem Tag sortieren, da jedes Datum als Geburtstagsdatum verwendet wird. Also möchte ich den nächsten Geburtstag sehen. – felix001

0

Wenn Sie anhand des Datums sortieren möchten, können Sie in einem Ergebnis-Abfrage-Set als: .order_by('date') bestellen.

Ich bin mir nicht sicher, ob das Ihre Frage beantwortet. Falls Sie meinen Sie nur die Personen mit Datum von heute auswählen möchten, können Sie verwenden:

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

Dies ist die Filterung der Ergebnisse, die OP muss ich nach dem heutigen Datum sortieren – karthikr

+0

Ich weiß, das habe ich auch beantwortet - aber wegen der Mehrdeutigkeit im Wortlaut von OP habe ich auch eine Erklärung hinzugefügt, falls er gefiltert werden müsste. – Javaaaa

+0

Die Frage ist, sortieren in aufsteigender Reihenfolge der Differenz in Timestamp im Vergleich zu jetzt – karthikr

Verwandte Themen