2011-12-12 185 views
6


我需要在某些時候動態增加一個時間戳plsql變量。
所以,與其這樣:如何動態添加時間間隔到時間戳?

timestamp_ := timestamp_ + INTERVAL '1' DAY; 

我想這樣做thomething這樣的:

timestamp_ := timestamp_ + INTERVAL days_ DAY; 

它並沒有真正的工作。 我的最終目標是爲一些具有變量過期日期的實體動態創建一些調度程序作業,以避免創建一個經常執行的單個作業。

回答

12

這聽起來像你想

timestamp_ := timestamp + numtodsinterval(days_, 'day'); 

我會有些拘謹,但是,關於涉及創建數千個就業機會的調度,而不是定期運行,以清除過期行一個作業的架構。單一的工作對於管理和監督來說更容易。

+0

謝謝你的回答!我會就這些工作提出建議。 – Michael

1
Special note: 
1. INTERVAL YEAR TO MONTH and 
2. INTERVAL DAY TO SECOND 

are the only two valid interval datatypes; 

Sample Example: 
============================= 
DECLARE 
    l_time      INTERVAL YEAR TO MONTH; 
    l_newtime     TIMESTAMP; 
    l_year      PLS_INTEGER := 5; 
    l_month      PLS_INTEGER := 11; 
BEGIN 
    -- Notes : 
    -- 1. format is using "-" to connect year and month 
    -- 2. No need to mention any other keyword ; Implicit conversion takes place to set interval 

    l_time := l_year || '-' || l_month; 

    DBMS_OUTPUT.put_line (l_time); 

    SELECT SYSTIMESTAMP + l_time INTO l_newtime FROM DUAL; 

    DBMS_OUTPUT.put_line ('System Timestamp :' || SYSTIMESTAMP); 
    DBMS_OUTPUT.put_line ('New Timestamp After Addition :' || l_newtime); 
END; 
============================= 
1

試試這個:

DECLARE 
    l_val  NUMBER; 
    l_result VARCHAR2(20); 
BEGIN 
    l_val := 1; 

    SELECT SYSDATE - INTERVAL '1' DAY * l_val INTO l_result FROM DUAL; 

    DBMS_OUTPUT.put_line('Current Date is ' || SYSDATE || ' minus ' || l_val || ' day(s) is ' || l_result); 
END; 

輸出將是:
當前日期是25-FEB-16減1天(s)爲24 FEB-16