2011-07-08 24 views

回答

2

也許我過於簡單化,但它似乎像下面應該只是罰款(爲整數),並且是很多比轉換爲日期和後面更具可讀性:

select case 
     when initial_extent is null then null 
     when substr(initial_extent,-2,1) = '1' 
      then initial_extent || 'th' 
     else case substr(initial_extent,-1,1) 
      when '1' then initial_extent || 'st' 
      when '2' then initial_extent || 'nd' 
      when '3' then initial_extent || 'rd' 
      else initial_extent || 'th' 
      end 
     end as formatted_number 
from user_tables 
+0

基於日期的方法很酷,但這是我最終的結果。不管你輸入什麼號碼都可以工作。日期方法可能會更好,如果你需要不同的語言結果。 – JoshL

8

假設提供的值是數字,而不是DATE,您可以使用TO_CHAR但你最終格式化之前的數值轉換爲字符串,然後DATE(朱利安):

SELECT TO_CHAR(TO_DATE('1', 'dd'), 'ddth') 
    FROM DUAL 

結果:

01st 

測試時,使用「d」爲格式,因爲該值被解釋爲公曆日期沒有返回預期的結果。無論是串輸出刪除前導零,或者提供完整的日期字符串(無關緊要的TO_CHAR,因爲它只是在一個月的日子興趣):

SELECT TO_CHAR(TO_DATE('1900-01-01', 'YYYY-MM-dd'), 'dth') 
    FROM DUAL 

因爲在31個日曆日結束,使用一年值,而不是處理數字大於31:

SELECT TO_CHAR(TO_DATE('32-01-01', 'YYYY-MM-dd'), 'yyth') 
    FROM DUAL 

結果:

32nd 
+0

我可能是錯的,但這不會返回'1th'而不是'1st'嗎? –

+0

是的,我錯了; [Oracle文檔](http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/sql_elements004.htm#autoId10)聲明'TH'是一個有效的格式元素後綴。 –

+0

@Vineet雷諾茲:好吧。 'TH'僅適用於我在測試10g時的日期。 –

-1
select substr(to_char(to_date(abs(decode(mod(l_value, 10), 0, 4, mod(l_value , 10) )), 'YYYY'), 'YTH'), 2) as value 
from dual 

用適當的,嗯,值替換l_value。應該包括任何數字。

相關問題