'04/04/2012 13:35 PM'
n'est pas une date - c'est une chaîne.
Oracle fera un implicite TO_DATE( string_value, format_mask )
sur les littéraux non-date lors de leur insertion dans un DATE
colonne en utilisant la valeur de NLS_DATE_FORMAT
paramètre de session comme masque de format (remarque :il s'agit d'un paramètre de session et appartient au client ; ce n'est pas un paramètre global ). Si le littéral non-date correspond à ce format, cela fonctionnera (et si ce n'est pas le cas, ce ne sera pas le cas) - cependant, si le NLS_DATE_FORMAT
est déjà modifié, il se cassera immédiatement (cela peut être très pénible à déboguer car le code qui fonctionnait ne le fera pas, mais personne n'aura changé le code).
Vous pouvez trouver votre NLS_DATE_FORMAT
actuel avec la requête :
SELECT VALUE
FROM NLS_SESSION_PARAMETERS
WHERE PARAMETER = 'NLS_DATE_FORMAT';
Il est préférable d'utiliser explicitement TO_DATE()
avec le masque de format correct ou d'utiliser un littéral de date ANSI/ISO (c'est-à-dire DATE '2012-04-04'
ou TIMESTAMP '2012-04-04 13:35'
).
Vous pouvez faire :
INSERT INTO STORE ( id, opening_time )
VALUES( 1, TO_DATE( '04/04/2012 13:35', 'DD/MM/YYYY HH24:MI' );
(vous n'avez pas besoin du AM/PM
car le composant heure est déjà sur une horloge de 24 heures)
ou
INSERT INTO STORE ( id, opening_time )
VALUES( 1, TIMESTAMP '2012-04-04 13:35:00' );
(en utilisant le littéral d'horodatage ANSI/ISO qu'Oracle convertira implicitement en une date)