2010-11-05 31 views
2

J'ai une date et je voudrais imprimer le décalage de cette date. Je peux le faire:PL/SQL et les intervalles de date

dbms_output.put_line(to_char(g_startDate - interval '4' month ,'YYYY-MM-DD')); 

et cela fonctionne très bien. Le problème est que l'intervalle est variable. Lorsque j'essaie ceci:

dbms_output.put_line(to_char(g_startDate - interval g_dateOffsetAmt month ,'YYYY-MM-DD')); 

Je reçois une erreur de compilation.

je pensais que ce serait peut-être parce que g_dateOffsetAmt est un integer donc j'ai essayé ceci:

dbms_output.put_line(to_char(g_startDate - interval to_char(g_dateOffsetAmt) month ,'YYYY-MM-DD')); 

Bien que je reçois encore des erreurs du compilateur en disant:

 

Error: PLS-00103: Encountered the symbol "TO_CHAR" when expecting one of the following: 

      .) , * @ & | = - + at in is mod remainder not rem => 
      .. or != or ~= >= and or like 
      LIKE2_ LIKE4_ LIKEC_ as between from using || member 
      SUBMULTISET_ 
     The symbol "," was substituted for "TO_CHAR" to continue. 
Line: 704 

Error: PLS-00103: Encountered the symbol "MONTH" when expecting one of the following: 

      . () , * % & | = - + at in is mod remainder not range 
      rem => .. or != or ~= >= and or 
      like LIKE2_ LIKE4_ LIKEC_ between || multiset member 
      SUBMULTISET_ 
     The symbol "." was substituted for "MONTH" to continue. 
Line: 704 

Y at-il une autre façon de le faire?

Répondre

3

Il y a deux manières de le faire .. Ou tapez votre variable étant passé dans comme un intervalle, ou utiliser la fonction ADD_MONTHS à la place:

declare 
    v_interval INTERVAL YEAR TO MONTH := interval '4' month; 
begin 
    dbms_output.put_line(to_char((sysdate - v_interval), 'MM/DD/YYYY')); 
end; 

declare 
    v_interval PLS_INTEGER := 4; 
begin 
    dbms_output.put_line(to_char(add_months(sysdate, -v_interval), 'MM/DD/YYYY')); 
end; 
+0

Yup, 'add_months' fait exactement ce que je veux. Et pour penser que je l'ai déjà utilisé et que je l'ai oublié :(J'ai besoin du week-end pour l'homme! – FrustratedWithFormsDesigner

+1

Et l'utilisation de mois supplémentaires contourne le problème ennuyeux d'ORA-01839 quand on utilise l'arithmétique d'intervalle à la fin d'un mois, par exemple ' date '2010-03-30' - interval '1' month' Mais add_months a aussi ses propres problèmes à la fin du mois, si vous comparez 'add_months (date' 2010-02-27 ', 1) 'et 'add_months (date '2010-02-28', 1)' –

6

Vous auriez probablement eu envie d'utiliser la fonction NumToYMInterval

declare 
    v_interval pls_integer := 4; 
begin 
    dbms_output.put_line(sysdate - NumToYMInterval(v_interval, 'month')); 
end; 
/
+0

Je vais devoir essayer de me souvenir de celui-ci aussi. – FrustratedWithFormsDesigner