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')
Was bedeutet "gegen sortieren"? Sie können nach Datum mit gewöhnlichem '.order_by ('date')' sortieren. –
@PavelAnossov Ich denke, er meint '[heute, vor 2 Tagen, 3 Tagen in der Zukunft, vor 4 Tagen, ...]' - relativ zum heutigen Tag sortieren – karthikr
können Sie eine Beispielausgabe liefern – catherine