ORA-00984此处不允许使用oracle SQL中的日期列

时间:2015-04-13 15:01:05

标签: sql oracle ora-00984

我将值插入此表

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

我插入的第二个日期不允许列中的错误,但不是第一个。我试过在日期周围加上引号,但我只是得到了另一个错误。

1 个答案:

答案 0 :(得分:7)

  

' 14-NOV-2014'

为什么要在 DATE 列中插入字符串? '14-NOV-2014' STRING DATE 。您不应该依赖隐式数据类型转换

始终使用 TO_DATE 和正确的格式掩码将字符串明确转换为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 literal,例如:

timestamp '2014-11-14 22:15'