Как динамически добавить интервал в метку времени? - PullRequest
7 голосов
/ 13 декабря 2011

Мне нужно в какой-то момент динамически увеличивать переменную временной метки plsql.Поэтому вместо этого:

timestamp_ := timestamp_ + INTERVAL '1' DAY;

Я бы хотел сделать что-то вроде этого:

timestamp_ := timestamp_ + INTERVAL days_ DAY;

Это на самом деле не работает.Моя конечная цель состоит в том, чтобы динамически создавать задания планировщика для некоторых сущностей с переменной датой истечения срока, чтобы избежать создания единственного, которое часто выполнялось бы.

Ответы [ 3 ]

15 голосов
/ 13 декабря 2011

Звучит так, как вы хотите

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

Однако я был бы несколько осторожен с архитектурой, которая включает в себя создание тысяч заданий планировщика, а не одного задания, которое периодически запускается для очистки устаревших строк.Одна работа - это чертовски легко управлять и контролировать.

1 голос
/ 25 февраля 2016

Попробуйте это:

    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-ФЕВ-16 минус 1 день (-ы): 24-ФЕВ-16

1 голос
/ 24 сентября 2014
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;
=============================
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...