在虚拟列中获取两个日期的分钟数差异

时间:2020-06-20 19:36:23

标签: sql oracle

我已经尝试过在网上搜寻此问题的大多数方法,但没有一个能真正得到回报,因此我不得不在这里提出以下要求: 我如何在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');

2 个答案:

答案 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));
相关问题