Oracle
 sql >> Database >  >> RDS >> Oracle

convertendo aaaa-mm-gg in mm/gg/aaaa

Le date non hanno un formato:sono rappresentate internamente da 7 o 8 byte . È solo quando a un programma client viene passata una data che quel programma client (potenzialmente) gli dà un formato.

Il formato stringa predefinito per le date in SQL/Plus o SQL Developer è impostato da NLS_DATE_FORMAT parametro di sessione. Gli altri client in genere hanno parametri che puoi impostare per il formato della data predefinito (se non usano anche il NLS impostazioni). Tuttavia, fai attenzione che il NLS_DATE_FORMAT è un parametro di sessione, quindi appartiene alla sessione dell'utente e più utenti possono avere ciascuno un valore diverso per il parametro corrispondente a come lo hanno impostato.

Se vuoi assegnare a una data un formato specifico, dovrai convertirlo in una stringa:

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

Perché la tua query non funziona :

TO_DATE( value, frmt ) si aspetta un valore stringa e una maschera di formato. Il TO_DATE('2016-05-01 00:00:00','YYYY-MM-DD HH24:MI:SS') interno è perfettamente valido e restituirà il DATE '2016-05-01' .

Tuttavia, l'esterno TO_DATE() viene quindi passato il DATE tipo che hai appena generato e il formato della stringa (invece delle due stringhe che si aspetta). Oracle chiamerà implicitamente TO_CHAR() sulla data e utilizzare il NLS_DATE_FORMAT parametro di sessione come maschera di formato. Questo sta generando una stringa dalla data e, dato l'errore, il valore di NLS_DATE_FORMAT non è MM/DD/YYYY HH24:MI:SS quindi quando l'esterno TO_DATE() tenta di analizzare la stringa creata in modo implicito fallisce poiché il primo numero letto non è valido per un mese.