2011-09-29 21 views
0

喜得到了類似的問題,這個問題排序分組依據日期在數據庫

Tricky "grouped" ordering in SQL

但不能似乎使它與日期

工作

我的桌子有點

Car_ID Car_Brand Car_Model Car_launch_date 
    1  Ford  Fiesta  12-12-2011 
    2  Ford  Mustang  09-04-2008 
    3  Ford  Focus  10-02-2012 
    4  Honda  Civic  11-05-2012 
    6  Honda  Jazz  02-05-2011 
    7  Toyota  Prius  11-10-2011 

我希望我的結果按照與現在最接近的未來日期排序,然後是最接近現在的過去日期(並按品牌分組)

我希望我的輸出是這樣的:

Car_ID Car_Brand Car_Model Car_launch_date 
    7  Toyota  Prius  11-10-2011 
    1  Ford  Fiesta  12-12-2011 
    3  Ford  Focus  10-02-2012 
    2  Ford  Mustang  09-04-2008 
    4  Honda  Civic  11-05-2012 
    6  Honda  Jazz  02-05-2011 

回答

1

在數據庫中的對象DATE或字符串日期?因爲如果您嘗試將它們排序爲字符串,那就行不通了!

如果日期DATE S,嘗試:

SELECT * from my_table 
ORDER BY Car_Brand DESC, 
     Car_launch_date < NOW(), 
     ABS(DATEDIFF(Car_launch_date, NOW())) 

如果他們是字符串,請嘗試:

SELECT * from my_table 
ORDER BY Car_Brand DESC, 
     DATE(Car_launch_date) < NOW(), 
     ABS(DATEDIFF(DATE(Car_launch_date), NOW())) 

當您在訂單中指定多個列,它通過訂單第一列,然後如果第一列中的值相同,則下一列。

此命令通過 - 汽車品牌,然後 - 是否過去的日期。首先定購虛假。 (所以未來的第一個),然後 - 日期的絕對差異(最小的數字第一)

注意:我把Car_Brand DESC(顛倒alpha順序),因爲這就是你如何在上面。

感謝OP發現你想要更復雜的訂單。但我要說的這種方式是更好的:)

0

使用以前的文章作爲補充,更好的答案是:

GROUP BY Car_Brand 
ORDER BY 
CASE WHEN Car_launch_date >= NOW() THEN 0 ELSE 1 END, 
CASE WHEN Car_launch_date >= NOW() THEN DATEDIFF(Car_launch_date, NOW()) ELSE DATEDIFF(NOW(), Car_launch_date) END 

查詢使用conditionnal語句,首先要確定它是否是一個未來或過去的日期。如果是將來,它輸出0,並且過去輸出1,所以未來的日期將排序第一和過去的日期排序第二。接下來的另一個案例陳述來檢測如何計算從現在到發佈日期之間的天數差異。