2010-04-18 60 views
4

我試圖訂購結果從當前日期起計我需要不尋常的訂購mysql的結果

這是即時使用現在;

SELECT * FROM friends JOIN bdays 
ON bdays.user = friends.friendname 
WHERE username = $userid ORDER BY DATE_FORMAT(date, '%m %d') 

有什麼想法嗎?

例如 排序現在爲止,排序生日開始於一月

我需要什麼,是不是在一月開始列表,從當前日起它。

所以,而不是;

January 
February 
March 
April 
May 
June 
July 
August 
September 
November 
December 

它會命令他們這樣;

April (current month/day) 
May 
June 
July 
August 
September 
November 
December 
January 
February 
March 
April (all the way up to yesterday) 
+0

你爲什麼要格式化它?爲什麼不只是'ORDER BY date'? – 2010-04-18 17:48:03

+0

今年在我的具體情況是沒有用的,這些都是生日,所以這一年並不重要, – mrpatg 2010-04-18 17:50:24

+0

以及這應該工作。日期字段的格式是什麼? – 2010-04-18 17:53:19

回答

2

你可以嘗試:

ORDER BY 
    DATE_FORMAT(date,'%m %d') < DATE_FORMAT(NOW(),"%m %d"), 
    DATE_FORMAT(date,'%m %d'); 

首先,爲了通過日期是否不小於當前日期,然後爲了通過月份和日期升序排列。

注意 這看起來像Col.Shrapnel所指的方法。

1

像以便通過如果(DATE_FORMAT(日期, '%M%d')< DATE_FORMAT(現在的(), '%M%d')),1,0),DATE_FORMAT(日期,」 %M%d')

1

你可以嘗試:

SELECT *, DATE_FORMAT(date, '%m %d') as adate FROM friends JOIN bdays 
ON bdays.user = friends.friendname 
WHERE username = $userid 
ORDER BY adate 
+0

- 可能無法使用,因爲列類型可能仍是日期。 – dar7yl 2010-04-18 18:21:31

4

以下是我會做:

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 | 
+----+------------+------+