2017-04-21 34 views
-2

這對廣告客戶聯繫他們的客戶需要通過標準來排序數據庫:排序按日期時間,只剩下空空的時間在年底

  1. 如果沒有指定日期這是一個無關緊要的接觸,並應列出在底部。

  2. 如果指定日期但時間不是,那麼它應該列在該日期的底部。

字段 'contact_request' 是DATETIME

因此,目標:

  1. 無日期條目(0000-00-00:00:00)應在表的末尾列出。
  2. 應在日期結束時列出永恆項(%00:00:00)。

所以期望的結果是這樣的(00:00:00末,否則排序ASC):

2017-01-21 09:00:00 | 1 
2017-03-21 00:00:00 | 2 
2017-03-22 11:00:00 | 3 
2017-01-18 10:00:00 | 4 
2017-03-21 10:00:00 | 5 
0000-00-00 00:00:00 | 6 
0000-00-00 00:00:00 | 7 

這使得錯誤的序列(4,1,5,3,2, ..而不是正確的4,1,5,2,3,..):

ORDER BY 
    CASE 
    WHEN contact_request = '0000-00-00' THEN 3 
    WHEN contact_request NOT LIKE '%00:00:00' THEN 1 
    ELSE 2 
    END, 
    contact_request ASC 

無法弄清楚如何做到這一點?

SQLFiddle:http://sqlfiddle.com/#!9/5c6c3/6(沒有 '0000-00-00 00:00:00' 拋出一個錯誤,但是這反正一個容易)

+0

所以數據類型爲字符串?不是日期時間?你將需要拆分日期/時間。當時間是00:00:00時,您需要將其設置爲24:00:00,因爲沒有這樣的時間。那麼它會正確排序。但是這是假設字符串數據。因此,如果日期不是000且時間爲零,則假設24小時日期格式,則將00:00:00替換爲24:00:00。 – xQbert

+0

提示:將您的CASE放在SELECT列表中 - 並使用它來訂購 – Randy

+0

在您的文章中一遍又一遍地重複相同的內容是毫無用處的。請不要這樣做。如果你這樣做是爲了繞過最小文本限制,不要。相反,要更好地解釋你的問題或問題。如果因爲這個原因你沒有這樣做,反正不要這樣做。這是不必要的噪音和混亂,應該刪除。 –

回答

2

由於您將所有時間戳與不合格的時間賦予相同的值,因此將這些結果分組到最後的不合格日期之前,您正在保存該結果。

case語句具有更復雜一點,實現你的願望:

ORDER BY 
    CASE 
    WHEN contact_request = '0000-00-00' THEN 1 
    ELSE 2 
    END, /* not qualified dates at the end */ 
    DATE_FORMAT(contact_request , '%Y%m%e'), /* then order by day */ 
    CASE 
    WHEN contact_request LIKE '%00:00:00' THEN 2 
    ELSE 1 
    END, /* not qualified times at the end of each day */ 
    contact_request /* finally order by whole timestamp */ 
+0

非常感謝,按原樣運作!只需要在第3行用'THEN 3'替換'THEN 2'。 – Konservin

+0

你說得對,我修好了。很高興它幫助:) –

+0

只是一個問題,但:現在似乎無法排序降序:看看http://sqlfiddle.com/#!9/5c6c3/4 – Konservin

0

您可以使用這樣的查詢:

SELECT * 
FROM yourTable 
ORDER BY 
IF(contact_request = '0000-00-00 00:00:00' 
    ,'9999-12-31 23:59:59' 
    ,IF(TIME(contact_request) = '00::00:00' 
      , ADDTIME('2017-01-01 00:00:00','23:59:59') 
      , contact_request ) ASC; 
+0

這並不涉及使用日期排序那些聯繫請求,但00:00:00時間到當天結束時。 (第二要求) – xQbert

+0

@xQbert - 謝謝。我有正確的答案 –

0
ORDER BY 
CASE when replace(CONTACT_REQUEST,'00:00:00','24:00:00) = '0000-00-00 24:00:00' 
    then 2 else 1 end 

假設字符串數據類型contact_Request。

這工作,因爲該日期存儲爲字符串,24是不是有效的時間,但00被製作成24小時會把它最後在每天