2011-06-07 96 views
0

在Sql Server 2008中,我有一個數據庫表,數據中包含一個字段,表示時間段的格式爲:2d,1w,4y,其中「d」=日, 「w」=周,「y」=年。根據這個字段進行排序的最好方法是什麼,以便它們按時間順序排列(例如「1y」之前的「3w」)?Sql服務器 - 如何排序而不是字母數字

感謝

+0

一位聰明人曾告訴我只按每列存儲一條信息。你在這個列中存儲多個,這是什麼導致你的問題。最好的解決方案是以不同的方式存儲數據:可能是3列。 – 2011-06-07 17:48:52

回答

2

我想你是幸運的,d是之前W和W也是前Ÿ所以你可以做

ORDER BY RIGHT(MyField, 1), CONVERT(int, LEFT(Field, LEN(Field) - 1))

但是這不會對8D之前把1瓦特例。

所以替代(更復雜)的解決方案可能是

ORDER BY 
    CASE RIGHT(Field, 1) 
     WHEN 'd' THEN LEFT(Field, LEN(Field) - 1) 
     WHEN 'w' THEN 7*LEFT(Field, LEN(Field) - 1) 
     ELSE 356 * LEFT(Field, LEN(Field) - 1) 
    END 

它使你的數據的假設(例如,僅d,W和Y打算在那裏),不採取跨越帳戶年(如果有的話)。

+0

2d小於5d - 在你的例子中,這將不會被正確處理。 – CristiC 2011-06-07 14:02:12

+0

@Parkyprg:當然會的。你沒有看到第二個排序字段嗎? – Ray 2011-06-07 14:04:41

+0

@雷:你不知道可以在那裏。例如2d會在10d後出現,因爲它是一個字符串。 – CristiC 2011-06-07 14:06:51

2

隨着時間的推移,您可能會有不同的時期。所以我會把這段時間放在一個帶有ID,時間段和排序順序(或幾天)的新表中。在初始表中,用time_period_id替換該字段,並在您的查詢中加入並在SORT BY中使用它。

+0

如果您能夠修改架構,這是正確的解決方案。 – Ray 2011-06-07 14:14:29

1

與串數字替換你的角色,並在排序前轉換成整數,像:

convert(int, replace(replace(replace(myField,'d',''),'w','0')'y','00')) 

所以你的3D是3,2w爲20和4Y是400


思考後有一點,通過案例表達式來計算真實值會更好。例如得到14的2w小於13d。

+0

您可能希望使y 000,否則40w是大於1y = 100的400。 – Ray 2011-06-07 14:08:16

+0

是的,你是對的。所以最好計算真實的時間跨度。 – ibram 2011-06-07 14:11:15

0

我的方法是編寫一個函數來解析持續時間字符串,並以儘可能小的單位進行歸一化(我假設它是幾天,但如果您可以有幾個小時或一些較小的單位表達,使用它)。然後,有一個計算列,該列是針對您的列調用的該函數的值。那時,這只是一個比較數字的問題。當然,魔鬼的細節......我不想嘗試從T-SQL解析文本。