2012-12-07 124 views
1

我有一個varchar列,我有日期時間值,現在字符串值。我需要按日期時間值排序,並列出底部的所有字符串值。我有以下日期時間:SQL按日期時間排序,然後按字符串

ORDER BY CAST(q2.[Due Date] AS DATETIME) 

但是我的結果在整個結果中都有「暫停」的值。我需要「保持」在列表的底部。

回答

2

如果唯一的非日期值是「待定」,那麼這應該在大多數SQL引擎的工作方式:

order by (case when q2.[Due Date] = 'On Hold' then 0 else 1 end) desc, 
     (case when q2.[Due Date] <> 'On Hold' then cast(q2.[Due Date] as datetime) end) 

但是,如果您將日期存儲爲字符串,那麼請使用'YYYY-MM-DD HH:MI:SS'格式。這將允許您排序它們而不必進行轉換。

如果他們在此格式下,你可以使用類似:

order by (case when left([Due Date], 1) between '0' and '9' then 0 else 1 end), 
     [Due Date] 

(只是通過[到期日]在多數情況下工作,因爲之前的字母數字排序順序然而,任意字符串可以從其他非alpha字符開始。)

+0

,除非我將一個值的測試更改爲isdate(),允許字符串值通過,對於日期值 – Beth

+0

@Beth返回null。 。 。我說過這對大多數SQL引擎都有效。 'isDate'特定於SQL Server和Sybase。 –

+0

感謝Gordon,你的第二個想法像魅力一樣工作。 – RamonaA

2

不知道你的平臺是什麼,但在SQL Server,你可以這樣寫:

SELECT q2.[Due Date] 
FROM yourTable q2 
ORDER BY ISDATE(q2.[Due Date]) DESC; 
+0

這一個沒有工作。我還有我的日期混入了我的暫停。謝謝 – RamonaA

相關問題