2013-10-11 83 views
0

存在以字符串形式存儲月份名稱的表格。 我想按年份和月份排序,以便獲得正確的結果。將varchar中的月份名稱轉換爲日期以便按月排序

year(string) Month(string) data 
------------ ------------ ---- 
2012   August  bigbox 
2012   December  samllbox 
2013   April   samll box 
2012   September  larg 

我想按年份和月份訂購。在2012,2013年... 一月,二月,三月....

我知道 case語句的方法時 月= '月',那麼1 月 - FEB THEN 2

但我do'nt想用這個作爲程序會太大..

+5

在選擇'string'作爲你的數據類型之前,你應該考慮這一點。你可以在你的DBMS中查找一個函數,看看如何處理。 –

+0

如果您可以更改表格的佈局,那麼您應該真的使用日期時間列,它非常容易使用(ORDER BY datetime DESC)就是您所需要的。 – Kevin

回答

1
SELECT * 
FROM TABLE 
ORDER BY [year] DESC, 
     DATEPART(month,[Month] + ' 01 ' + CONVERT(VARCHAR(4),[YEAR])) 

上面的代碼將會給你想要的東西,但我強烈建議你重新考慮你的設計。

現在您正在保留一個至少15個字符長的字符串類型字段。該字段沒有任何值比顯示原因。你可以有一個DATETIME場,這將是由(不必做計算存在),如果你想顯示月份的名稱,你可以使用短得多:

DATENAME (month, DateField) 
+4

你爲什麼假設SQL Server? –

+0

我正在sql server 2008上工作。你可以給我解釋一下這個.. bcz我得到的結果按月份名稱排序正確,但它的像{2013年1月 2013年1月 2012年1月} – user2637506

+0

我想要的答案像..2013 jan,2013年4月,2013年8月,2012年1月,2012年3月...... – user2637506

3

你最好的選擇是使用適當的日期類型。否則,創建一個表格(內嵌或物理)來映射字符串的月份。

SELECT 1 AS month, 'January' AS strMonth 
UNION ALL 
SELECT 2, 'February' 
UNION ALL 
SELECT 3, 'March' 
... 
SELECT 12, 'December' 

然後映射這張表。 See a demo

+0

謝謝,但我的程序將充滿邏輯..我想要一些內置函數... – user2637506

+3

內置函數不是解決方案時,設計不佳。 – Kermit

相關問題