यहां बताया गया है कि मैं इसे कैसे करूंगा:
SELECT *, (DATE_FORMAT(date, '%j')-DATE_FORMAT(NOW(), '%j')+365)%365 AS d
FROM foo ORDER BY d;
%j
दिनांक प्रारूप वर्ष का दिन है, अर्थात एक संख्या 001...366.
मैंने कुछ नमूना डेटा पर इसका परीक्षण किया और यह आपके द्वारा वर्णित तरीके से सॉर्ट करता है:यह वर्ष को अनदेखा करता है, और अगली तारीख को सॉर्ट करता है जो पहले वर्तमान तिथि के बाद आता है, फिर आरोही, और वर्ष में पहले की तारीखों के आसपास लपेटता है।
+----+------------+------+
| id | date | d |
+----+------------+------+
| 5 | 1999-05-15 | 27 |
| 6 | 1992-06-15 | 59 |
| 7 | 1990-07-15 | 88 |
| 8 | 1988-08-15 | 120 |
| 9 | 1980-11-15 | 212 |
| 1 | 2010-01-15 | 272 |
| 2 | 2009-02-15 | 303 |
| 3 | 2004-03-15 | 332 |
| 4 | 2002-04-15 | 362 |
+----+------------+------+