2017-10-13 78 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

相關問題