1

このテーブルに値を挿入しています

    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)
    ); 

そして、ここに私が挿入する値があります

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

そして、挿入した2番目の日付では列が許可されていませんというエラーが表示されますが、最初の日付では表示されません。日付を引用符で囲んでみましたが、別のエラーが発生します。

4

1 に答える 1

7

「2014 年 11 月 14 日」

DATE列に文字列を挿入するのはなぜですか? DATE'14-NOV-2014'ではなくSTRINGです。_ 暗黙的なデータ型変換に依存しないでください。

常に、TO_DATEと適切なformat maskを使用して、明示的に文字列を DATE に変換します。

例えば、

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

もう一つ、

DepartureTime varchar2(5)

意味がありません。すでに DATE 列があります。DATE には時間要素もあります。

別の時間列は必要ありません。DATE には、日付要素と時刻要素の両方が 7 バイトに格納されています。

Oracle は DATE を合計 7 バイトで格納します。その中の各バイトには、次のように DATE の要素の値が格納されます。

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

必要なのは、2 つの 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
);

そして、値を次のように挿入します。

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')
);

アップデート

@GriffeyDog と @a_horse_with_no_name のコメントで述べたように。

または、代わりにANSI リテラルを使用することもできます。次に例を示します。

timestamp '2014-11-14 22:15'
于 2015-04-13T15:06:17.967 に答える