Les données dans COL1 sont au format jj-mon-aa
Non ce n'est pas. Une DATE
la colonne ne le fait pas avoir n'importe quel format. Il n'est converti (implicitement) que dans cette représentation par votre client SQL lorsque vous l'affichez.
Si COL1 est vraiment une DATE
colonne utilisant to_date()
dessus est inutile car to_date()
convertit une chaîne en une DATE.
Vous n'avez besoin que de to_char(), rien d'autre :
SELECT TO_CHAR(col1, 'mm/dd/yyyy')
FROM TABLE1
Ce qui se passe dans votre cas, c'est que l'appel de to_date()
convertit la DATE
en une valeur de caractère (en appliquant le format NLS par défaut), puis en la reconvertissant en DATE. En raison de cette double conversion implicite, certaines informations sont perdues en cours de route.
Modifier
Vous avez donc fait cette grosse erreur en stockant une DATE dans une colonne de caractères. Et c'est pourquoi vous avez des problèmes maintenant.
La meilleure solution (et pour être honnête :la seule raisonnable) consiste à convertir cette colonne en une DATE
. Ensuite, vous pouvez convertir les valeurs en n'importe quelle représentation de votre choix sans vous soucier de la conversion implicite du type de données.
Mais la réponse la plus probable est "J'ai hérité de ce modèle, je dois y faire face " (c'est toujours le cas, apparemment personne n'est jamais responsable du choix du mauvais type de données), alors vous devez utiliser RR
au lieu de YY
:
SELECT TO_CHAR(TO_DATE(COL1,'dd-mm-rr'), 'mm/dd/yyyy')
FROM TABLE1
devrait faire l'affaire. Notez que j'ai aussi changé mon
à mm
comme votre exemple est 27-11-89
qui a un numéro pour le mois, pas un "mot" (comme NOV )
Pour plus de détails, consultez le manuel :http://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements004.htm#SQLRF00215