Os dados em COL1 estão em dd-seg-aa
Não, não é. Uma
DATE
coluna não tem qualquer formato. Ele só é convertido (implicitamente) para essa representação pelo cliente SQL quando você o exibe. Se COL1 for realmente um
DATE
coluna usando to_date()
nele é inútil porque to_date()
converte uma string em um DATE. Você só precisa de to_char(), nada mais:
SELECT TO_CHAR(col1, 'mm/dd/yyyy')
FROM TABLE1
O que acontece no seu caso é que chamar
to_date()
converte o DATE
em um valor de caractere (aplicando o formato NLS padrão) e, em seguida, convertendo-o de volta para uma DATA. Devido a essa dupla conversão implícita, algumas informações são perdidas no caminho. Editar
Então você cometeu aquele grande erro de armazenar uma DATA em uma coluna de caracteres. E é por isso que você tem os problemas agora.
A melhor (e para ser honesto:apenas sensata) solução é converter essa coluna em um
DATE
. Em seguida, você pode converter os valores em qualquer representação que desejar sem se preocupar com a conversão implícita de tipo de dados. Mas provavelmente a resposta é "Eu herdei esse modelo, tenho que lidar com isso " (sempre é, aparentemente ninguém nunca é responsável por escolher o tipo de dados errado), então você precisa usar
RR
em vez de YY
:SELECT TO_CHAR(TO_DATE(COL1,'dd-mm-rr'), 'mm/dd/yyyy')
FROM TABLE1
deve fazer o truque. Observe que também alterei
mon
para mm
como seu exemplo é 27-11-89
que tem um número para o mês, não uma "palavra" (como NOV ) Para mais detalhes consulte o manual:http://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements004.htm#SQLRF00215