2009-10-14 84 views
1

我有一個簡單的任務列表,其中包含標題字段和截止日期字段。有些任務有截止日期,其他任務沒有。截止日期只是存儲在MySQL日期類型中。使用MySQL排序最近的日期

但是最困難的(我反正)是按照正確的順序對任務進行排序:

  1. 升序限期
  2. 其餘的(也許ID,但並不重要)

目前查詢:

SELECT * FROM tasks ORDER BY deadline ASC 

的截止日期字段爲 '0000-00-00' 在默認情況下,所以這QUER Ÿ將呈現以下順序的任務:

  1. 任務,沒有最後期限
  2. 升序期限

任何人都可以點我在正確的方向,或者我需要做多個查詢?

+3

爲什麼沒有最後期限被默認爲空? – 2009-10-14 14:10:27

回答

3
SELECT * FROM tasks 
ORDER BY CASE WHEN deadline = '0000-00-00' 
       THEN '9999/09/09' 
       ELSE deadline 
     END ASC 

排序時,替換「0000-00-00」:「9999/09/09」 。

+0

這個作品很有魅力,謝謝! – 2009-10-15 08:11:52

2

如果用戶沒有輸入截止日期,一個明顯的可能性是(在創建項目的應用程序中)在未來(如'9999-12-31')設置截止日期的方式。當然,目前還不清楚是否可以由「大」 datetime值更改代碼或不...

+0

實際上,字段類型日期默認爲空,所以你是對的。我可以改變代碼,但是用查詢解決它不是更容易。 – 2009-10-14 17:13:40

+0

可能 - 如果它是空的,那麼(正如其他人已經指出的那樣),在查詢中處理它是非常微不足道的。對於這個問題,如果它是「0000-00-00」,你可以在查詢中處理它,但是我會更加關心這個問題 - 我可以看到有人真正輸入了它(如果你讓它們),意思是「立即」。 – 2009-10-14 17:51:56

1

難道真的是0000-00-00?該docs說:

「支持的範圍是‘1000年1月1日’到‘9999-12-31’。」

我會考慮在儲存期限爲NULL那些不這樣做有一個。

SELECT * FROM tasks ORDER BY ifnull(deadline, '9999-12-31') ASC 
+0

你是對的。默認情況下它是空的,但是代碼插入了0000-00-00,但是我可以改變它。儘管字段類型不是日期時間,但是日期。 – 2009-10-15 06:54:03

+0

你試過查詢嗎? – 2009-10-15 07:32:26

0

使用藏在哪裏你的任務沒有截止日期:

SELECT * FROM tasks WHERE deadline != '0000-00-00' ORDER BY deadline 
+0

對我來說這看起來不像是有效的SQL,MySQL似乎同意。 – 2009-10-15 07:34:47

+0

wops,我轉換位置和訂購。 – knittl 2009-10-15 07:42:18

+0

據我所知,他想列出所有的任務,但沒有截止日期之後的所有任務排序。 – 2009-10-15 08:06:59

0

您也可以嘗試使用SELECT DISCTINCT