Sql 在最后一列中插入日期差异
我想在第6列中插入第4列和第5列的日期差,但这给了我一个错误,说第4列不允许Sql 在最后一列中插入日期差异,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我想在第6列中插入第4列和第5列的日期差,但这给了我一个错误,说第4列不允许 insert into leave25 vALUES (4, 4, 'SICK', TO_DATE('22-AUG-14','DD-MON-YY'), TO_DATE('22-SEP-14','DD-MON-YY'), startdate-enddate)\\ 您不能这样做,您需要使用您想要插入的值: INSERT INTO leave25 VALUES ( 4,
insert into leave25 vALUES (4, 4, 'SICK', TO_DATE('22-AUG-14','DD-MON-YY'), TO_DATE('22-SEP-14','DD-MON-YY'), startdate-enddate)\\
您不能这样做,您需要使用您想要插入的值:
INSERT INTO leave25
VALUES (
4,
4,
'SICK',
TO_DATE('22-AUG-14', 'DD-MON-YY'),
TO_DATE('22-SEP-14', 'DD-MON-YY'),
TO_DATE('22-SEP-14', 'DD-MON-YY') - TO_DATE('22-AUG-14', 'DD-MON-YY')
此外,如果此列始终包含该差异,您确定需要存储此冗余信息吗
另一种方法是使用触发器填充该列,而不显式地给它一个值,但这取决于您的环境和需要。您不能这样做,您需要使用您想要插入的值:
INSERT INTO leave25
VALUES (
4,
4,
'SICK',
TO_DATE('22-AUG-14', 'DD-MON-YY'),
TO_DATE('22-SEP-14', 'DD-MON-YY'),
TO_DATE('22-SEP-14', 'DD-MON-YY') - TO_DATE('22-AUG-14', 'DD-MON-YY')
此外,如果此列始终包含该差异,您确定需要存储此冗余信息吗
另一种方法是使用触发器填充该列,而不显式地给它一个值,但这取决于您的环境和需要。始终在
INSERT
语句中显式指定列名。那样比较安全
如果希望避免再次写入日期,可以从子查询中选择值
INSERT INTO leave25
(col1,
col2,
col3,
startdate,
enddate,
days)
SELECT t.*,
startdate - enddate
FROM (SELECT 4,
4,
'SICK',
to_date('22-AUG-14', 'DD-MON-YY') as startdate,
to_date('22-SEP-14', 'DD-MON-YY') as enddate
FROM dual) t;
此外,我同意Aleksej的观点,最好将此差异存储为而不是列本身。始终在
INSERT
语句中明确指定列名。那样比较安全
如果希望避免再次写入日期,可以从子查询中选择值
INSERT INTO leave25
(col1,
col2,
col3,
startdate,
enddate,
days)
SELECT t.*,
startdate - enddate
FROM (SELECT 4,
4,
'SICK',
to_date('22-AUG-14', 'DD-MON-YY') as startdate,
to_date('22-SEP-14', 'DD-MON-YY') as enddate
FROM dual) t;
此外,我同意Aleksej的观点,最好将此差异存储为而不是列本身。使用虚拟列:
CREATE TABLE Leave25(
EMPLOYEEID INTEGER
CONSTRAINT LEAVE25__EMPID__FK REFERENCES Employee24,
LEAVEID INTEGER
CONSTRAINT LEAVE25__LEAVEID__PK PRIMARY KEY,
LEAVETYPE VARCHAR2(20)
CONSTRAINT LEAVE25__LEAVETYPE__NN NOT NULL
CONSTRAINT LEAVE25__LEAVETYPE__CHK CHECK (
LEAVETYPE IN 'EARNED', 'SICK'
),
STARTDATE DATE
CONSTRAINT LEAVE25__STARTDATE__NN NOT NULL,
ENDDATE DATE
CONSTRAINT LEAVE25__ENDDATE__NN NOT NULL,
DURATION NUMBER
GENERATED ALWAYS AS ( ENDDATE - STARTDATE ) VIRTUAL
);
并创建一个序列来管理主键:
CREATE SEQUENCE LEAVE25__LEAVEID__SEQ;
然后你可以做:
INSERT INTO leave25 (
EMPLOYEEID, LEAVEID, LEAVETYPE, STARTDATE, ENDDATE
) VALUES (
4, LEAVE25__LEAVEID__SEQ.NEXTVAL, 'SICK', DATE '2014-08-22', DATE '2014-09-22'
)
使用虚拟列:
CREATE TABLE Leave25(
EMPLOYEEID INTEGER
CONSTRAINT LEAVE25__EMPID__FK REFERENCES Employee24,
LEAVEID INTEGER
CONSTRAINT LEAVE25__LEAVEID__PK PRIMARY KEY,
LEAVETYPE VARCHAR2(20)
CONSTRAINT LEAVE25__LEAVETYPE__NN NOT NULL
CONSTRAINT LEAVE25__LEAVETYPE__CHK CHECK (
LEAVETYPE IN 'EARNED', 'SICK'
),
STARTDATE DATE
CONSTRAINT LEAVE25__STARTDATE__NN NOT NULL,
ENDDATE DATE
CONSTRAINT LEAVE25__ENDDATE__NN NOT NULL,
DURATION NUMBER
GENERATED ALWAYS AS ( ENDDATE - STARTDATE ) VIRTUAL
);
并创建一个序列来管理主键:
CREATE SEQUENCE LEAVE25__LEAVEID__SEQ;
然后你可以做:
INSERT INTO leave25 (
EMPLOYEEID, LEAVEID, LEAVETYPE, STARTDATE, ENDDATE
) VALUES (
4, LEAVE25__LEAVEID__SEQ.NEXTVAL, 'SICK', DATE '2014-08-22', DATE '2014-09-22'
)
请检查我的答案,如果它对您有帮助,请接受,或者为给定的解决方案提供相关反馈(评论)。请阅读:了解它的重要性。请检查我的答案,如果它对您有帮助,请接受它,或者为给定的解决方案提供相关反馈(评论)。请阅读:了解为什么它很重要。