2011-07-08 10 views

risposta

2

Forse sto banalizzando, ma sembra che il seguente dovrebbe funzionare bene (per i numeri interi) ed è molto più leggibile di conversione in una data e ritorno:

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

L'approccio basato sulla data è interessante, ma questo è ciò che ho concluso. Funziona a prescindere da quale numero ci passi. L'approccio alla data potrebbe essere migliore se hai bisogno di risultati diversi per lingua. – JoshL

8

Assumendo il valore fornito è numerico, piuttosto che data, è possibile utilizzare TO_CHAR ma è necessario convertire il valore numerico in una stringa, quindi una data (Julian) prima di formattarla in definitiva:

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

Risultato :

01st 

Durante il test, utilizzando 'd' per il formato non ha prodotto i risultati attesi perché il valore viene interpretato come una data di Julian. O substring l'uscita per rimuovere lo zero, o fornire una stringa data completa (non importa il TO_CHAR perché è interessati solo il giorno del mese):

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

Perché giorni di calendario terminano alle 31, utilizzare il valore anno invece di gestire i numeri maggiori di 31:

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

Risultato:

32nd 
+0

potrei sbagliarmi, ma questo non restituirebbe '1 °' invece di '1st'? –

+0

Sì, ho sbagliato; [Oracle docs] (http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/sql_elements004.htm#autoId10) afferma che 'TH' è un suffisso di un elemento di formato valido. –

+0

@Vineet Reynolds: Tutto bene. 'TH' è disponibile solo per le date quando stavo testando su 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 

Sostituisci l_value con il valore appropriato, hmmm. Dovrebbe coprire qualsiasi numero.

Problemi correlati