2011-07-08 12 views

Respuesta

2

Tal vez estoy simplificando demasiado, pero parece que el siguiente debería funcionar bien (para los números enteros) y es mucho más legible que la conversión a una fecha y vuelta:

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

El enfoque basado en la fecha es genial, pero esto es con lo que terminé. Funciona independientemente de qué número le arrojes. El enfoque de fecha podría ser mejor si necesita resultados diferentes por idioma. – JoshL

8

Suponiendo que el valor proporcionado es numérico, en lugar de fecha, puede utilizar TO_CHAR pero hay que convertir el valor numérico a una cadena, entonces una fecha (Julian) antes de finalmente formatearlo:

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

Resultado :

01st 

Al realizar pruebas, el uso de 'd' para el formato no arrojó los resultados esperados porque el valor se interpreta como una fecha juliana. De cualquier subcadena la salida para eliminar el cero, o proporcionar una cadena de fecha completa (no importa a la TO_CHAR, ya que sólo está interesado en el día del mes):

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

Debido extremo días naturales a 31, utilizar el valor de año en vez de manejar números mayores que 31:

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

Resultado:

32nd 
+0

puedo estar equivocado, pero ¿esto no devolvería '1º' en lugar de' 1º'? –

+0

Sí, estaba equivocado; los [documentos de Oracle] (http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/sql_elements004.htm#autoId10) indican que 'TH' es un sufijo de elemento de formato válido. –

+0

@Vineet Reynolds: S'all bien. 'TH' solo está disponible para las fechas en las que estaba probando 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 

Reemplace l_value con el valor apropiado, hmmm. Debería cubrir cualquier número.

Cuestiones relacionadas