sql >> Database >  >> RDS >> Oracle

Liquibase-script retourneert ORA-01843:geen geldige maand

'02.01.15 12:00:00' is geen datum, het is een string; als u het probeert in te voegen in een DATE datatype kolom, dan zal Oracle proberen het naar een datum te casten met het equivalent van:

SELECT TO_DATE(
         '02.01.15 12:00:00',
         ( SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_DATE_FORMAT' )
       ) as CHANGED
FROM   DUAL

Dus als uw NLS_DATE_FORMAT sessieparameter komt niet overeen met het formaat van uw string '02.01.15 12:00:00' dan zal het een uitzondering opleveren - en dit is wat er lijkt te gebeuren aangezien je ORA-01843: not a valid month krijgt .

De beste oplossing is om je script aan te passen om de string expliciet naar een datum te casten:

MERGE INTO A config
USING (
  SELECT 100 as id,
         TO_DATE( '02.01.15 12:00:00', 'DD.MM.YY HH24:MI:SS' ) as CHANGED,
         0 as DELETED,
         1 as B
  FROM   DUAL
) src ON (src.id = config.id)
WHEN NOT MATCHED THEN 
  INSERT(id,CHANGED, DELETED, B) VALUES(src.id, src.CHANGED, src.DELETED, src.B)
WHEN MATCHED THEN
  UPDATE SET config.B = src.B;

of om een ​​letterlijke tijdstempel te gebruiken:TIMESTAMP '2015-01-02 12:00:00'

Maar u kunt ook een aanmeldingstrigger maken om de NLS_DATE_FORMAT . te wijzigen sessieparameter. Wikkel de trigger om deze code:

ALTER SESSION SET NLS_DATE_FORMAT = 'DD.MM.YY HH24:MI:SS';

Dit verandert echter de datumnotatie die wordt gebruikt in alle impliciete conversies van tekenreeks naar datum (en vice versa), dus andere zoekopdrachten die ook afhankelijk zijn van dergelijke impliciete conversies, kunnen hierdoor worden verbroken. Elke gebruiker kan ook zijn sessieparameters op elk moment wijzigen, dus het instellen van deze standaard bij het inloggen is afhankelijk van het feit dat hij deze nooit tijdens zijn sessie verandert.

[TL;DR] Pas uw script aan om geen impliciete conversies tussen gegevenstypen te gebruiken in plaats van het formaatmodel aan te passen dat wordt gebruikt voor impliciete conversies.



  1. Twee SQL LEFT JOINS produceren een onjuist resultaat

  2. SQL-query om OrderID, transactionID, Status op te halen op basis van transactiestatus die Char . is

  3. Toegang krijgen tot de MySQL-database met c# op unity?

  4. hoe deze query ook rijen met een waarde van 0 te laten retourneren?