'04/04/2012 13:35 PM'
is geen datum - het is een string.
Oracle doet een impliciete TO_DATE( string_value, format_mask )
op niet-date letterlijke waarden bij het invoegen in een DATE
kolom met de waarde van de NLS_DATE_FORMAT
sessieparameter als formaatmasker (opmerking:dit is een sessieparameter en hoort bij de client; het is geen globale instelling ). Als de letterlijke niet-datum overeenkomt met dit formaat, zal het werken (en als dat niet het geval is, dan niet) - echter, als de NLS_DATE_FORMAT
ooit wordt gewijzigd, zal het onmiddellijk breken (het zal een enorme pijn zijn om te debuggen omdat de code die werkte niet, maar niemand zal de code hebben gewijzigd).
U kunt uw huidige NLS_DATE_FORMAT
. achterhalen met de vraag:
SELECT VALUE
FROM NLS_SESSION_PARAMETERS
WHERE PARAMETER = 'NLS_DATE_FORMAT';
Het is beter om expliciet TO_DATE()
te gebruiken met het juiste formaatmasker of om een letterlijke ANSI/ISO-datum te gebruiken (d.w.z. DATE '2012-04-04'
of TIMESTAMP '2012-04-04 13:35'
).
Je kunt het volgende doen:
INSERT INTO STORE ( id, opening_time )
VALUES( 1, TO_DATE( '04/04/2012 13:35', 'DD/MM/YYYY HH24:MI' );
(je hebt de AM/PM
niet nodig aangezien de uurcomponent al op een 24-uursklok staat)
of
INSERT INTO STORE ( id, opening_time )
VALUES( 1, TIMESTAMP '2012-04-04 13:35:00' );
(met behulp van de letterlijke ANSI/ISO-tijdstempel die Oracle impliciet naar een datum zal converteren)