2015-04-13 1 views
1

Im insérer des valeurs dans ce tableauORA-00984 Colonne pas autorisée ici avec la date dans Oracle SQL

CREATE TABLE Flight ( 
    FlightNumber   char(7) primary key, 
    ArrivalAirportCode char(6) references Airport (Airport_code), 
    DepartureAirportCode char(6) references Airport (Airport_code), 
    AircraftNumber  varchar2(25) references Aircraft (AircraftNumber), 
    ArrivalDate   date, 
    ArrivalTime   Varchar2(5), 
    DepartureDate  date, 
    DepartureTime  varchar2(5) 
    ); 

et voici les valeurs Im insérer dans ce

INSERT INTO FLIGHT values 
    ('CA3048', 
    'LHR', 
    'EDI', 
    'N859E', 
    '14-NOV-2014', 
    '22:15', 
    '14-NOV-2014', 
    '20:15'); 

Et je reçois la colonne ne autorisé ici erreur pour la 2ème date que j'insère, mais pas le premier. J'ai essayé de mettre des citations autour de la date mais j'ai juste une autre erreur.

+0

pas directement lié à votre question, mais ce modèle de données/mise en œuvre a plusieurs défauts. Pourquoi stockez-vous ArrivalTime séparément de ArrivalDate, et pourquoi utilisez-vous une chaîne de caractères?Le type de données 'DATE' est parfaitement capable de stocker des dates avec des temps. De plus, vous utilisez le type de données CHAR - les valeurs CHAR sont automatiquement remplies avec des blancs, ce qui entraîne toutes sortes de problèmes. Utilisez VARCHAR2 à la place. –

Répondre

6

'14 -Nov-2014'

Pourquoi vous insérez une chaîne dans une colonne DATE? '14-NOV-2014' est un STRING et NOT un DATE. Vous ne devez pas dépendre de conversion de type de données implicite.

toujours, convertir la chaîne en date utilisant explicitement TO_DATE et format approprié masque.

Par exemple,

TO_DATE('14-NOV-2014','DD-MON-YYYY') 

Une chose,

DepartureTime varchar2 (5)

n'a pas de sens. Vous avez déjà une colonne DATE, une DATE aurait aussi l'élément time.

Pas besoin d'une colonne de temps séparée. Une date comporte des éléments de date et d'heure stockés dans 7 octets.

Oracle stocke DATE au total de 7 octets. Chaque octet stocke des valeurs pour un élément de la DATE comme suit:

Byte Description 
---- ------------------------------------------------ 
1  Century value but before storing it add 100 to it 
2  Year and 100 is added to it before storing 
3  Month 
4  Day of the month 
5  Hours but add 1 before storing it 
6  Minutes but add 1 before storing it 
7  Seconds but add 1 before storing it 

Tout ce que vous devez faire est d'avoir juste 2 colonnes DATE:

CREATE TABLE Flight ( 
    FlightNumber   char(7) primary key, 
    ArrivalAirportCode char(6) references Airport (Airport_code), 
    DepartureAirportCode char(6) references Airport (Airport_code), 
    AircraftNumber  varchar2(25) references Aircraft (AircraftNumber), 
    ArrivalDate   date, 
    DepartureDate  date 
); 

Et puis insérez les valeurs:

INSERT INTO FLIGHT values 
    ('CA3048', 
    'LHR', 
    'EDI', 
    'N859E', 
    TO_DATE('14-NOV-2014 22:15:00','DD-MON-YYYY HH24:MI:SS'), 
    TO_DATE('14-NOV-2014 20:15:00','DD-MON-YYYY HH24:MI:SS') 
); 

Mise à jour

Comme mentionné dans les commentaires par @GriffeyDog et @a_horse_with_no_name.

Alternativement, vous pouvez aussi le ANSI literal à la place, par exemple:

timestamp '2014-11-14 22:15' 
+1

Ou utilisez la syntaxe Oracle [date littérale] (http://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements003.htm#SQLRF51049): 'date '2014-11-14'' – GriffeyDog

+0

@ GriffeyDog J'ai dû détailler la partie temps, donc je n'ai pas mentionné la date littérale ;-) –

+0

D'accord, l'OP ne devrait pas stocker l'heure séparément. – GriffeyDog