sql >> Database >  >> RDS >> Oracle

ORA-1843:geen geldige maand tijdens het bijwerken van record

Een datum heeft geen formaat - het wordt intern in de database opgeslagen als 7-bytes (wat staat voor jaar, maand, dag, uur, minuut en seconde) en het is pas als de gebruikersinterface die u gebruikt (d.w.z. SQL/Plus, SQL Developer, Java, enz.) deze aan u, de gebruiker, probeert weer te geven en converteert het in iets dat je zinvol zou vinden (meestal een string) dat de datum een ​​formaat heeft.

Als u een opgemaakte datum opgeeft voor een procedure, dan is het een string en zal Oracle proberen deze impliciet naar een datum te casten met behulp van de NLS_DATE_FORMAT sessieparameter:

UPDATE your_table
SET your_date_column = '18-06-14'; -- or equivalently via a bind parameter

Wordt impliciet geconverteerd naar

UPDATE your_table
SET your_date_column = TO_DATE(
                         '18-06-14',
                         ( SELECT value
                           FROM   NLS_SESSION_PARAMETERS
                           WHERE  parameter = 'NLS_DATE_FORMAT' )
                       );

Als de NLS_DATE_FORMAT komt niet overeen, dan zal Oracle een uitzondering maken (en de parameter kan door elke gebruiker worden ingesteld, dus u moet er niet op vertrouwen dat deze consistent is - vooral in internationale organisaties waar het standaard datumformaat afhangt van uw territorium en taal).

Als u de waarde bijwerkt, gebruik dan een DATE letterlijk en niet een string:

UPDATE your_table
SET your_date_column = DATE '2014-06-18';

Of converteer de string expliciet en geef het formaatmodel op:

UPDATE your_table
SET your_date_column = TO_DATE( '18-06-14', 'DD-MM-RR' );

Hetzelfde geldt voor het doorgeven van parameters aan uw functie. Gebruik een DATE letterlijk:

BEGIN
  your_procedure(
    p_launch_date => DATE '2014-06-18'
  );
END;
/

of converteer de string expliciet naar een datum (en vertrouw niet op impliciete conversie):

BEGIN
  your_procedure(
    p_launch_date => TO_DATE( '18-06-14', 'DD-MM-RR' )
  );
END;
/



  1. MYSQL-gegevens weergeven vanuit een menu

  2. Een tabel maken in SQL Server (T-SQL)

  3. Postgres dynamische kolomkoppen (van een andere tabel)

  4. Een reeks SQL-query's uitvoeren met behulp van een batchbestand?