Oracle日期到字符串转换

Ram*_*Ram 11 sql oracle

当我这样做时,我有一个字符串列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)

应该做的伎俩.请注意,我也改变monmm作为你的例子是27-11-89具有数月,而不是一个"字"(样NOV)

有关更多详细信息,请参见手册:http://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements004.htm#SQLRF00215