Oracle--to_char()函数

to_char()函数的一些使用 

用于 to_char(numeric) 的模板 

模板描述
9带有指定位数的值
0前导零的值
. (句点)小数点
, (逗号)分组(千)分隔符
PR尖括号内负值
S带负号的负值(使用本地化)
L货币符号(使用本地化)
D小数点(使用本地化)
G分组分隔符(使用本地化)
MI在指明的位置的负号(如果数字 < 0)
PL在指明的位置的正号(如果数字 > 0)
SG在指明的位置的正/负号
RN罗马数字(输入在 1 和 3999 之间)
TH or th转换成序数
V移动 n 位(小数)(参阅注解)
EEEE科学记数。现在不支持。

 

用法须知:

  • 使用 'SG','PL' 或 'MI' 的带符号字并不附着在数字上面;例如,to_char(-12, 'S9999') 生成 ' -12',而 to_char(-12, 'MI9999') 生成 '- 12'。Oracle 里的实现不允许在 9 前面使用 MI,而是要求 9 在 MI 前面。
  • PL,SG,和 TH 是 Postgres 扩展。
  • 9 表明一个与在 9 字串里面的一样的数字位数。如果没有可用的数字,那么使用一个空白(空格)。
  • TH 不转换小于零的值,也不转换小数。TH 是一个 Postgres 扩展。
  • V 方便地把输入值乘以 10^n,这里 n 是跟在 V 后面的数字。to_char 不支持把 V 与一个小数点绑在一起使用(例如. "99.9V99" 是不允许的)。

表 5-11. to_char 例子 

输入输出
to_char(now(),'Day, HH12:MI:SS')'Tuesday , 05:39:18'
to_char(now(),'FMDay, HH12:MI:SS')'Tuesday, 05:39:18'
to_char(-0.1,'99.99')' -.10'
to_char(-0.1,'FM9.99')'-.1'
to_char(0.1,'0.9')' 0.1'
to_char(12,'9990999.9')' 0012.0'
to_char(12,'FM9990999.9')'0012'
to_char(485,'999')' 485'
to_char(-485,'999')'-485'
to_char(485,'9 9 9')' 4 8 5'
to_char(1485,'9,999')' 1,485'
to_char(1485,'9G999')' 1 485'
to_char(148.5,'999.999')' 148.500'
to_char(148.5,'999D999')' 148,500'
to_char(3148.5,'9G999D999')' 3 148,500'
to_char(-485,'999S')'485-'
to_char(-485,'999MI')'485-'
to_char(485,'999MI')'485'
to_char(485,'PL999')'+485'
to_char(485,'SG999')'+485'
to_char(-485,'SG999')'-485'
to_char(-485,'9SG99')'4-85'
to_char(-485,'999PR')'<485>'
to_char(485,'L999')'DM 485
to_char(485,'RN')' CDLXXXV'
to_char(485,'FMRN')'CDLXXXV'
to_char(5.2,'FMRN')V
to_char(482,'999th')' 482nd'
to_char(485, '"Good number:"999')'Good number: 485'
to_char(485.8,'"Pre-decimal:"999" Post-decimal:" .999')'Pre-decimal: 485 Post-decimal: .800'
to_char(12,'99V999')' 12000'
to_char(12.4,'99V999')' 12400'
to_char(12.45, '99V9')' 125'
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 我无法确定为什么您的代码会报错,因为我无法看到数据库的具体情况。在您的代码中,您正在执行一个 SELECT 语句,该语句会从一个名为 DUAL 的虚拟表中检索一行数据。在 SELECT 子句中,您使用了一个 CASE 语句,该语句会根据当前日期的月份来返回不同的值。如果当前日期的月份是 1,则返回上一年的年份,否则返回当前年份。 要解决您的错误,您需要检查您的代码是否正确,并检查数据库中是否有任何问题。有时,错误可能是由于数据库服务器故障或其他问题造成的。如果您无法解决问题,建议您向数据库管理员或技术支持人员寻求帮助。 ### 回答2: select case when to_char(sysdate,'mm') = '01' then to_char(sysdate, 'yyyy') -1 else to_char(sysdate, 'yyyy') end from dual; 报错是因为在SQL语句中,无法直接对字符串进行减法操作。当条件满足时,to_char(sysdate, 'yyyy') 返回的是一个字符串类型的年份,无法直接进行减法操作。 要解决这个问题,可以考虑使用to_number函数将字符串类型的年份转换为数字类型,再进行减法操作。 例如,可以使用下面的语句来修正报错: select case when to_char(sysdate,'mm') = '01' then to_number(to_char(sysdate, 'yyyy')) - 1 else to_number(to_char(sysdate, 'yyyy')) end from dual; ### 回答3: 该SQL语句报错的原因是因为在Oracle数据库中,无法在SELECT语句中直接使用IF-ELSE语句或CASE语句来处理逻辑判断。在CASE语句中,只能使用在某个列上进行条件判断,并返回相应的结果。 解决该问题的办法有两种: 1. 使用PL/SQL语句:将这段逻辑判断放在一个PL/SQL块中,然后再使用SELECT语句来查询结果。例如: ``` DECLARE result VARCHAR2(4); BEGIN IF to_char(sysdate, 'mm') = '01' THEN result := to_char(sysdate, 'yyyy') - 1; ELSE result := to_char(sysdate, 'yyyy'); END IF; SELECT result INTO result FROM dual; DBMS_OUTPUT.PUT_LINE(result); END; ``` 2. 使用SQL表达式:利用Oracle内置的函数来实现相同的逻辑判断,然后直接使用SELECT语句查询结果。例如: ``` SELECT CASE WHEN to_char(sysdate, 'mm') = '01' THEN to_char(sysdate, 'yyyy') - 1 ELSE to_char(sysdate, 'yyyy') END AS result FROM dual; ``` 以上两种方式都可以实现类似的逻辑判断,并返回正确的结果,根据具体情况选择使用哪种方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值