2012-10-21 14 views
7

Mam tabeli w sql następująco:SQL "nie jest prawidłowym miesięcy"

CREATE TABLE Reserves(
    sid INTEGER, 
    bid INTEGER, 
    day DATE, 
    PRIMARY KEY (sid, bid, day), 
    FOREIGN KEY (sid) REFERENCES Sailors, 
    FOREIGN KEY (bid) REFERENCES Boats 
); 

i próbuję wstawić do niego:

INSERT INTO Reserves VALUES(22, 101, '01-01-1998'); 

Ale pojawia się błąd: ORA -01843: niepoprawny miesiąc

To jest baza danych Oracle. Nie jestem pewien, co jest nie tak z moim formatem daty.

+3

Jako ogólną zasadę należy zawsze używać formatu daty kultura inspecific (RRRRMMDD), chyba że są deklarowania format daty explcitly. "02-01-2012" może być 2 stycznia 2012 r. Lub 1 lutego 2012 r., Jednak "20120102" oznacza ** zawsze ** 2 stycznia 2012 r. – GarethD

Odpowiedz

21

To nie jest do końca jasne, które chciałeś, więc można spróbować:

  • Dla formatu miesiąc-dzień-rok:

    INSERT INTO Reserves VALUES(22, 101, TO_DATE('01-01-1998','MM-DD-YYYY'));

  • Dla formacie dzień-miesiąc-rok:

    INSERT INTO Reserves VALUES(22, 101, TO_DATE('01-01-1998','DD-MM-YYYY'));

Również zalecana lektura: Oracle functions: TO_DATE

0

Spróbuj "1998-01-01".

Uważam, że domyślny format daty dla oracle to rrrr-mm-dd. Można zmienić domyślne dla sesji za pomocą alter sesji ustawiony nls_date_format = „MM-DD-YYYY”

Należy pamiętać, że większość klientów pozwalają ustawić to co chcesz na stałe

9

Można użyć date słów kluczowych, aby określić datę ciąg ANSI standard:

INSERT INTO Reserves VALUES(22, 101, date '1998-01-01'); 

W tym przypadku format YYYY-MM-DD, lub od 1 stycznia 1998 r

+0

Dzięki Bob. Miałem nadzieję, że był sposób, że nie musiałbym używać funkcji TO_DATE. – Matt

5

Jak @Jody wspomniano również,
Ty Można zmienić domyślne sesji wykonując ten kod raz przed INSERT:

ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MM-YYYY';

Można zmienić format w dowolnej kolejności.

Źródło:dba-oracle.com

Powiązane problemy