Oracle
 sql >> Base de données >  >> RDS >> Oracle

convertir aaaa-mm-jj en mm/jj/aaaa

Les dates n'ont pas de format - elles sont représentées en interne par 7 ou 8 octets . Ce n'est que lorsqu'un programme client reçoit une date que ce programme client lui donne (potentiellement) un format.

Le format de chaîne par défaut pour les dates dans SQL/Plus ou SQL Developer est défini par le NLS_DATE_FORMAT paramètre de session. D'autres clients auront généralement des paramètres que vous pouvez définir pour le format de date par défaut (s'ils n'utilisent pas également le NLS réglages). Attention cependant au NLS_DATE_FORMAT est un paramètre de session, il appartient donc à la session de l'utilisateur et plusieurs utilisateurs peuvent chacun avoir une valeur différente pour le paramètre correspondant à la façon dont ils l'ont défini.

Si vous souhaitez donner à une date un format spécifique, vous devrez la convertir en chaîne :

SELECT TO_CHAR( DATE '2016-05-01', 'MM/DD/YYYY HH24:MI:SS' )
FROM   DUAL;

Pourquoi votre requête ne fonctionne pas :

TO_DATE( value, frmt ) attend une valeur de chaîne et un masque de format. Le TO_DATE('2016-05-01 00:00:00','YYYY-MM-DD HH24:MI:SS') est parfaitement valide et renverra le DATE '2016-05-01' .

Cependant, le TO_DATE() extérieur passe alors la DATE type que vous venez de générer et le format de chaîne (au lieu des deux chaînes qu'il attend). Oracle appellera implicitement TO_CHAR() à la date et utilisez le NLS_DATE_FORMAT paramètre de session comme masque de format. Cela génère une chaîne à partir de la date et, compte tenu de l'erreur, la valeur de NLS_DATE_FORMAT n'est pas MM/DD/YYYY HH24:MI:SS donc quand le TO_DATE() extérieur essaie d'analyser la chaîne créée implicitement, il échoue car le premier numéro qu'il lit est invalide pendant un mois.