当我这样做时,我有一个字符串列COL1
SELECT TO_CHAR(TO_DATE(COL1,'dd-mon-yy'), 'mm/dd/yyyy')
FROM TABLE1
Run Code Online (Sandbox Code Playgroud)
COL1中的数据为dd-mon-yy,例如:27-11-89,89为1989,但select将其返回为11/27/2089.
我必须做一个内部的TO_DATE,因为如果我没有,那么我得到一个无效的数字错误(ORA-01722:无效的数字)
怎么能显示1989而不是2089?请帮忙
a_h*_*ame 28
COL1中的数据是dd-mon-yy
不,这不对.一DATE
列并没有任何格式.它只在您显示它时由SQL客户端转换(隐含地)到该表示.
如果COL1实际上是一个DATE
使用to_date()
它的列是没用的,因为to_date()
将字符串转换为DATE.
你只需要to_char(),别的什么:
SELECT TO_CHAR(col1, 'mm/dd/yyyy')
FROM TABLE1
Run Code Online (Sandbox Code Playgroud)
在您的情况下发生的是调用to_date()
将转换DATE
为字符值(应用默认的NLS格式),然后将其转换回DATE.由于这种双重隐式转换,一些信息在途中丢失了.
编辑
所以你确实犯了一个大错误,就是把DATE存储在一个字符列中.这就是你现在遇到问题的原因.
最好的(也是诚实的:唯一明智的)解决方案是将该列转换为DATE
.然后,您可以将值转换为您想要的任何重新呈现,而无需担心隐式数据类型转换.
但最有可能的答案是" 我继承了这个模型,我必须应对它 "(它总是,显然没有人负责选择错误的数据类型),然后你需要使用RR
而不是YY
:
SELECT TO_CHAR(TO_DATE(COL1,'dd-mm-rr'), 'mm/dd/yyyy')
FROM TABLE1
Run Code Online (Sandbox Code Playgroud)
应该做的伎俩.请注意,我也改变mon
来mm
作为你的例子是27-11-89
具有数月,而不是一个"字"(样NOV)
有关更多详细信息,请参见手册:http://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements004.htm#SQLRF00215
归档时间: |
|
查看次数: |
112581 次 |
最近记录: |