2011-12-12 13 views
6


Necesito en algún momento incrementar dinámicamente una variable plsql de marca de tiempo.
Así, en lugar de hacer esto:¿Cómo agregar dinámicamente el intervalo a la marca de tiempo?

timestamp_ := timestamp_ + INTERVAL '1' DAY; 

me gustaría hacer thomething así:

timestamp_ := timestamp_ + INTERVAL days_ DAY; 

En realidad no funciona. Mi objetivo final es crear dinámicamente algunos trabajos del programador para algunas entidades que tienen una fecha de caducidad variable, para evitar la creación de una sola que a menudo se ejecutará.

Respuesta

12

Parece que usted quiere

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

que habría cierta cautela, sin embargo, sobre una arquitectura que implica la creación de miles de puestos de trabajo de programador en lugar de un trabajo que se ejecuta periódicamente para limpiar filas caducados. Un solo trabajo es mucho más fácil de administrar y supervisar.

+0

Gracias por la ¡responder! Tomaré consejos con respecto a esos trabajos. – 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

Prueba esto:

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; 

de salida será:
fecha actual es 25-FEB-16 menos 1 día (s) es de 24-Feb-16

Cuestiones relacionadas