Una data non ha un formato:viene archiviata internamente nel database come 7 byte (che rappresentano anno, mese, giorno, ora, minuti e secondi) e non è fino a quando l'interfaccia utente che stai utilizzando (ad esempio SQL/Plus, SQL Developer, Java, ecc.) non tenta di mostrarlo a te, all'utente e converte in qualcosa che potresti trovare significativo (di solito una stringa) che la data abbia un formato.
Se stai fornendo una data formattata a una procedura, sarà una stringa e Oracle tenterà di eseguirne il cast implicito in una data utilizzando NLS_DATE_FORMAT
parametro di sessione:
UPDATE your_table
SET your_date_column = '18-06-14'; -- or equivalently via a bind parameter
Viene convertito in modo implicito in
UPDATE your_table
SET your_date_column = TO_DATE(
'18-06-14',
( SELECT value
FROM NLS_SESSION_PARAMETERS
WHERE parameter = 'NLS_DATE_FORMAT' )
);
Se il NLS_DATE_FORMAT
non corrisponde, Oracle solleverà un'eccezione (e il parametro può essere impostato da ciascun utente, quindi non dovresti fare affidamento sulla sua coerenza, specialmente nelle organizzazioni internazionali quando il formato della data predefinito dipende dal tuo territorio e dalla tua lingua).
Se stai aggiornando il valore, usa un DATE
letterale e non una stringa:
UPDATE your_table
SET your_date_column = DATE '2014-06-18';
Oppure converti esplicitamente la stringa e fornisci il modello di formato:
UPDATE your_table
SET your_date_column = TO_DATE( '18-06-14', 'DD-MM-RR' );
Lo stesso vale per il passaggio di parametri alla tua funzione. Usa un DATE
letterale:
BEGIN
your_procedure(
p_launch_date => DATE '2014-06-18'
);
END;
/
o convertire esplicitamente la stringa in una data (e non fare affidamento sulla conversione implicita):
BEGIN
your_procedure(
p_launch_date => TO_DATE( '18-06-14', 'DD-MM-RR' )
);
END;
/