在Sql Server 2008中,我有一個數據庫表,數據中包含一個字段,表示時間段的格式爲:2d,1w,4y,其中「d」=日, 「w」=周,「y」=年。根據這個字段進行排序的最好方法是什麼,以便它們按時間順序排列(例如「1y」之前的「3w」)?Sql服務器 - 如何排序而不是字母數字
感謝
在Sql Server 2008中,我有一個數據庫表,數據中包含一個字段,表示時間段的格式爲:2d,1w,4y,其中「d」=日, 「w」=周,「y」=年。根據這個字段進行排序的最好方法是什麼,以便它們按時間順序排列(例如「1y」之前的「3w」)?Sql服務器 - 如何排序而不是字母數字
感謝
我想你是幸運的,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打算在那裏),不採取跨越帳戶年(如果有的話)。
隨着時間的推移,您可能會有不同的時期。所以我會把這段時間放在一個帶有ID,時間段和排序順序(或幾天)的新表中。在初始表中,用time_period_id替換該字段,並在您的查詢中加入並在SORT BY中使用它。
如果您能夠修改架構,這是正確的解決方案。 – Ray 2011-06-07 14:14:29
我的方法是編寫一個函數來解析持續時間字符串,並以儘可能小的單位進行歸一化(我假設它是幾天,但如果您可以有幾個小時或一些較小的單位表達,使用它)。然後,有一個計算列,該列是針對您的列調用的該函數的值。那時,這只是一個比較數字的問題。當然,魔鬼的細節......我不想嘗試從T-SQL解析文本。
一位聰明人曾告訴我只按每列存儲一條信息。你在這個列中存儲多個,這是什麼導致你的問題。最好的解決方案是以不同的方式存儲數據:可能是3列。 – 2011-06-07 17:48:52