我已经尝试过在网上搜寻此问题的大多数方法,但没有一个能真正得到回报,因此我不得不在这里提出以下要求: 我如何在vistual栏中获得2个日期的差额? 我尝试过这种方式:
CREATE TABLE RENTALS(
RENTID NUMBER(5) NOT NULL,
PICKUPDATE DATE NOT NULL,
LEAVEDATE DATE NOT NULL,
TIMEINMIN NUMBER AS (PICKUPDATE-LEAVEDATE)*24*60,
CUSTOMERID NUMBER(13) NOT NULL,
VINNUMBER VARCHAR2(25) NOT NULL,
PRICEPERMIN DECIMAL(1,2) NOT NULL,
REMARKS VARCHAR2(50),
PRIMARY KEY(RENTID)
);
在插入时出现此错误:
ORA-01438:值大于此列允许的指定精度
当我尝试时:
CREATE TABLE RENTALS(
RENTID NUMBER(5) NOT NULL,
PICKUPDATE DATE NOT NULL,
LEAVEDATE DATE NOT NULL,
TIMEINMIN NUMBER AS ROUND((PICKUPDATE-LEAVEDATE)*24*60),
CUSTOMERID NUMBER(13) NOT NULL,
VINNUMBER VARCHAR2(25) NOT NULL,
PRICEPERMIN DECIMAL(1,2) NOT NULL,
REMARKS VARCHAR2(50),
PRIMARY KEY(RENTID)
);
创建后我得到:
ORA-02000:丢失(关键字
如所指出的,我在这里添加我的插入语句:
INSERT INTO RENTALS(RENTID,PICKUPDATE,LEAVEDATE,CUSTOMERID,VINNUMBER,PRICEPERMIN,REMARKS) VALUES(1,SYSDATE,TRUNC(SYSDATE),1234567891011,'AAZZDDAF1234',1,'NEW SCRATCH');
答案 0 :(得分:2)
您指责错误的列。
SQL> create table rentals
2 (pickupdate date,
3 leavedate date,
4 timeinmin number as ((pickupdate - leavedate) * 24 * 60)
5 );
Table created.
SQL> insert into rentals (pickupdate, leavedate) values (sysdate, sysdate - 1);
1 row created.
SQL> select * from rentals;
PICKUPDATE LEAVEDATE TIMEINMIN
---------- ---------- ----------
06/20/2020 06/19/2020 1440
SQL>
这意味着虚拟列是可以的(为什么不可以?两个日期的差是天数乘以24和60相对较小)。
因此,请检查您要插入的其他列,尤其是那些大小受限制的列。
如果您发布INSERT
声明,将会更容易获得帮助;并非如此,您必须自己弄清楚。
答案 1 :(得分:0)
您的方法是正确的,但您并没有陷入困境。我认为添加它应该可以。
CREATE TABLE RENTALS(
RENTID NUMBER(5) NOT NULL,
PICKUPDATE DATE NOT NULL,
LEAVEDATE DATE NOT NULL,
TIMEINMIN NUMBER as (round((PICKUPDATE-LEAVEDATE)*24*60)),
CUSTOMERID NUMBER(13) NOT NULL,
VINNUMBER VARCHAR2(25) NOT NULL,
PRICEPERMIN DECIMAL(10,2) NOT NULL,
REMARKS VARCHAR2(50),
PRIMARY KEY(RENTID));