2011-12-12 182 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