2017-10-13 118 views
0

enter image description here任何人都可以帮助我如何将Time_done的输出更改为仅限时间(例如:5:00 AM)?如果我在SYSDATE添加TO_CHAR(SYSDATE, 'HH24:MI:SS'),我得到一个错误信息如何仅显示时间

ORA-01843:不是有效的月份。

下面是我的代码和

CREATE TABLE EVENTLOGS(
     Eventlog_id Number(3,0) NOT NULL, 
     User_name  Varchar2(20), 
     Date_done  Date, 
     Time_done  Timestamp, 
     Action_done Varchar2(50), 
    CONSTRAINT PK_EVENTLOGS PRIMARY KEY (Eventlog_id)); 

/* TRIGGER CREATION */ 
CREATE OR REPLACE TRIGGER SUPERHEROES_AUDIT 
AFTER INSERT OR DELETE OR UPDATE ON SUPERHEROES 
FOR EACH ROW 
ENABLE 
DECLARE 
    V_LOGID NUMBER; 
    V_USER VARCHAR(30); 
    V_DATE DATE; 

BEGIN 
    SELECT EVENTLOG_ID_SEQ.NEXTVAL, USER INTO V_LOGID, V_USER FROM DUAL; 
    IF INSERTING THEN 
    INSERT INTO EVENTLOGS(Eventlog_id, User_name, Date_done, Time_done, Action_done) 
    VALUES (V_LOGID, V_USER, SYSDATE, SYSDATE, 'INSERT'); 
    ELSIF DELETING THEN 
    INSERT INTO EVENTLOGS(Eventlog_id, User_name, Date_done, Action_done) 
    VALUES (V_LOGID, V_USER, V_DATE, SYSDATE, SYSDATE, 'DELETE'); 
    ELSIF UPDATING THEN 
    INSERT INTO EVENTLOGS(Eventlog_id, User_name, Date_done, Action_done) 
    VALUES (V_LOGID, V_USER, V_DATE, SYSDATE, SYSDATE, 'UPDATE'); 
    END IF; 
END; 
/

[![INSERT INTO 
EMPLOYEE_T (EmployeeID, EmployeeName, EmployeeAddress, EmployeeCity, EmployeeState, EmployeeZip, EmployeeBirthDate, EmployeeDateHired, EmployeeSupervisor) 
VALUES (2, 'JACKIE', 'AFRICA', 'kenya', 'NO', 11285, TO_DATE('13-OCT-1950', 'DD-MM-YYYY'), TO_DATE('27-JUN-2014', 'DD-MM-YYYY'), 455789);][1]][1] 

enter image description here

回答

1

您已经发布了一个不完整的TRIGGER代码太多错误EVENTLOGS表的屏幕截图。

如果要将数据插入TIMESTAMP列,则需要插入兼容的记录。仅插入时间部分并不有用,因为您无法直接执行列可能需要的算术/比较操作。我已经使用SYSTIMESTAMP功能在这里插入系统当前TIMESTAMP

CREATE OR REPLACE TRIGGER SUPERHEROES_AUDIT 
AFTER INSERT OR DELETE OR UPDATE ON SUPERHEROES 
FOR EACH ROW 
ENABLE 
DECLARE 
    V_LOGID NUMBER; 
    V_USER VARCHAR(30); 
    V_DATE DATE; 

BEGIN 
    SELECT EVENTLOG_ID_SEQ.NEXTVAL, USER, SYSDATE INTO V_LOGID, V_USER, V_DATE FROM DUAL; 
    IF INSERTING THEN 
    INSERT INTO EVENTLOGS(Eventlog_id, User_name, Date_done, Time_done,Action_done) 
    VALUES (V_LOGID, V_USER, V_DATE, SYSTIMESTAMP, 'INSERT'); 
    ELSIF DELETING THEN 
    INSERT INTO EVENTLOGS(Eventlog_id, User_name, Date_done,Time_done, Action_done) 
    VALUES (V_LOGID, V_USER, V_DATE, SYSTIMESTAMP, 'DELETE'); 
    ELSIF UPDATING THEN 
    INSERT INTO EVENTLOGS(Eventlog_id, User_name, Date_done,Time_done, Action_done) 
    VALUES (V_LOGID, V_USER, V_DATE, SYSTIMESTAMP, 'UPDATE'); 
    END IF; 
END; 
/

这里是样本数据

select * FROM EVENTLOGS; 


EVENTLOG_ID USER_NAME  DATE_DONE TIME_DONE      ACTION_DONE 
----------- -------------- --------- ------------------------------- ------------ 
      1 SLDDEVELOPER 13-OCT-17 13-OCT-17 04.58.07.237343000 AM INSERT  

如果你只需要时间部分,而不是在你的time_doneDATE部分,那么它应该是一个VARCHAR2列,您可以使用TO_CHAR,而在这种情况下插入,就像你正在尝试做的那样。

INSERT INTO EVENTLOGS(Eventlog_id, User_name, Date_done, Time_done,Action_done) 
    VALUES (V_LOGID, V_USER, V_DATE, TO_CHAR(SYSDATE,'HH24:MI:SS'), 'INSERT'); 
+0

再次谢谢你Kaushik! – Raymond