В Oracle, как мне преобразовать число, такое как 1, в строку, такую ​​как «1-й»? - PullRequest
6 голосов
/ 09 июля 2011

Я бы хотел отформатировать число как «1-й», «2-й», «4-й», «9-й» и т. Д. Есть ли функция Oracle, которая сделает это для меня?

Ответы [ 3 ]

8 голосов
/ 09 июля 2011

Предполагая, что предоставленное значение является числовым, а не 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
2 голосов
/ 12 июля 2011

Может быть, я упрощаю, но похоже, что следующее должно работать очень хорошо (для целых чисел) и намного более читабельно, чем преобразование в дату и обратно:

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 голосов
/ 11 июля 2011
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 на соответствующее значение, ммм.Должен охватывать любые цифры.

...