我想将数字格式化为“1st”,“2nd”,“4th”,“9th”等。是否有Oracle函数可以为我执行此操作?
答案 0 :(得分:8)
假设提供的值是数字而不是DATE,您可以使用TO_CHAR但是必须将数值转换为字符串,然后在最终格式化之前将DATE(Julian)转换为:
SELECT TO_CHAR(TO_DATE('1', 'dd'), 'ddth')
FROM DUAL
结果:
01st
测试时,使用'd'表示格式不会返回预期结果,因为该值被解释为Julian日期。要么输出子字符串以删除前导零,要么提供完整的日期字符串(与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
答案 1 :(得分: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
答案 2 :(得分:-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
用适当的hmmm值替换l_value。应该涵盖任何数字。