在表中创建具有time数据类型和插入时间数据的表

时间:2014-12-20 07:27:31

标签: sql oracle timestamp type-conversion

我想在表格中插入时间数据。那么,我应该使用什么类型的数据类型以及如何在表中插入时间?我使用了' timestamp'在create table语句中,但是当我在表中插入一个时间时,它显示一个错误(错误代码:ORA-01861)。请帮我。我使用ORACLE 11g。

DDL声明:

 CREATE TABLE "SOM"."FLIGHTS" 
   (    "FLNO" NUMBER(3,0) NOT NULL ENABLE, 
    "FROM" VARCHAR2(20 BYTE), 
    "TO" VARCHAR2(20 BYTE), 
    "DISTANCE" NUMBER(5,3), 
    "DEPARTS" TIMESTAMP (3), 
    "ARRIVES" TIMESTAMP (3), 
    "PRICE" NUMBER(5,2), 
     CONSTRAINT "FLIGHTS_PK" PRIMARY KEY ("FLNO")   );

插入声明:

insert into flights 
values (1, 'Bbsr', 'Calcutta', 600, timestamp '05:30', timestamp '06:50', 8000);

1 个答案:

答案 0 :(得分:2)

ORA-01861的消息是literal does not match format string。此错误意味着我们将字符串转换为其他数据类型,但字符串的格式错误。

您的insert语句使用ANSI SQL样式timestamp()函数将两个字符串转换为TIMESTAMP数据类型。此功能采用规定的格式:YYYY-MM-DD HH24.MI.SSYYYY-MM-DD HH24.MI.SS.FFYYYY-MM-DD HH24.MI.SS.FF TZ

您收到的是ORA-01861,因为您的字符串与其中一种格式不匹配:timestamp '05:30'

在这种情况下,解决方案是更改列数据类型:您不需要时间戳,这是特定日期的特定时间。你想要的只是飞​​行的起飞和着陆时间,这可以更好地表达为number(4,2)varchar2(5)一个检查约束。


另外两个观察结果。

您的insert语句的数值对于指定的数字列来说太大了,这很容易修复。

您的表定义使用oracle保留字作为列名TO和FROM。 create语句成功只是因为您已将所有内容都包装在双引号中,因此Oracle不会验证名称。使用这样的保留字是非常糟糕的做法。每当我们提到列时,我们都需要写...

  select  flno, "FROM", "TO" from flights;

...否则我们将获得ORA-00936(SQLFiddle demo)。那些不得不使用你的桌子并维护你的代码的可怜的人会永远地诅咒你。不要那样的人。