sql >> Database >  >> RDS >> Oracle

ORA-01840:invoerwaarde niet lang genoeg voor datumnotatie in Oracle Insert met Select

U kunt een datum niet ‘met een formaat’ invoegen. Datums hebben een interne representatie, ze hebben altijd alle datum/tijd-componenten en kunnen vervolgens worden opgemaakt voor weergave zoals u dat wilt.

De tekenreeks die u genereert als JJJJMM wordt impliciet geconverteerd naar een datum door de invoeging, aangezien dat het gegevenstype van de doelkolom is. Die impliciete conversie maakt gebruik van uw NLS-instellingen en verwacht dat een langere waarde overeenkomt met het NLS-datumformaat. Je tekenreeks komt niet overeen met dat impliciete formaat, wat de fout veroorzaakt die je ziet.

Als je alleen geïnteresseerd bent in het jaar en de maand, dan kun je het dichtst in de buurt komen door middernacht op de eerste van de maand op te slaan, wat je kunt krijgen met trunc :

INSERT INTO CS_LOG(NAME, ID, C_DATE)
Select MAX(ML.NAME), ML.ID, TRUNC(CHK_DATE,'MM')
from D_ID ML,CS_LOG MD
WHERE ML.NAME != MD.NAME and ML.ID != MD.ID
and MD.C_DATE = LAST_DAY(sysdate)
GROUP BY ML.ID,C_DATE;

Ik heb ook de extra to_date . verwijderd telefoongesprek. Overweeg ook om over te schakelen naar de ANSI-joinsyntaxis.

U kunt dan c_date format opmaken als JJJJMM voor weergave wanneer je het opvraagt, als dat is wat je nodig hebt, via to_char .



  1. Voeg twee tabellen samen op basis van tijdstempels in de buurt

  2. Ik probeer mysql-client te starten in Docker, maar ik krijg toegang geweigerd wegens gebruikersfout

  3. Zoek de parameternamen van een opgeslagen procedure

  4. De database 'xxx' kan niet worden geopend omdat het versie 904 is