Đây là cách tôi sẽ làm điều đó:
SELECT *, (DATE_FORMAT(date, '%j')-DATE_FORMAT(NOW(), '%j')+365)%365 AS d
FROM foo ORDER BY d;
%j
định dạng ngày là ngày trong năm, tức là số 001 ... 366.
Tôi đã thử nghiệm điều này trên một số dữ liệu mẫu và nó sắp xếp theo cách bạn mô tả:nó bỏ qua năm và sắp xếp ngày tiếp theo rơi vào sau ngày hiện tại trước, sau đó tăng dần và bao quanh các ngày đầu năm.
+----+------------+------+
| 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 |
+----+------------+------+