daily pastebin goal
29%
SHARE
TWEET

Untitled

a guest Mar 13th, 2018 50 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. FUNCTION data_pascoa (In_ano NUMBER) RETURN DATE IS
  2.  
  3. /**************************************
  4.  
  5.         Para calcular a data da Páscoa para qualquer ano no calendário Gregoriano
  6.         (o calendário civil no Brasil), usa-se a seguinte fórmula, com TODAS AS
  7.         VARIÁVEIS INTEIRAS, com os resíduos das divisões ignorados.
  8.         Usa-se A para ano, M para mês, e D para dia.
  9.         c = a/100
  10.         n = a - 19*(a/19)
  11.         k = (c - 17)/25
  12.         i = c - c/4 - (c-k)/3 +19*n + 15
  13.         i = i - 30*(i/30)
  14.         i = i - (i/28)*(1-(1/28)*(29/(i+1))*((21-n)/11))
  15.         j = a + a/4 + i + 2 -c + c/4
  16.         j = j - 7*(j/7)
  17.         l = i - j
  18.         m = 3 + (l+40)/44
  19.         d = l + 28 - 31*(m/4)
  20.  
  21.         Este algoritmo é de J.-M.Oudin (1940) e impresso no
  22.         Explanatory Supplement to the Astronomical Almanac, ed. P.K. Seidelmann (1992).
  23.  
  24.         Retirado originalmente de
  25.         http://www.if.ufrgs.br/~kepler/fis207/pascoa.html
  26.         e adaptado para PL/SQL por Ricardo Falter
  27.  
  28.  
  29.  
  30.     ********************************************************************************/
  31.  
  32.  
  33.     A   INTEGER := In_ano; -- unico parametro, o ano a se obter a data da pascoa
  34.     M   INTEGER; -- variavel para o mes
  35.     D   INTEGER; -- variavel para o dia
  36.     S   INTEGER; -- variavel para o seculo
  37.     I   INTEGER; -- variavel auxiliar
  38.     J   INTEGER; -- variavel auxiliar
  39.     K   INTEGER; -- variavel auxiliar
  40.     L   INTEGER; -- variavel auxiliar
  41.     N   INTEGER; -- variavel auxiliar
  42. BEGIN
  43.     S      := trunc (A / 100);
  44.     N      := A - 19 * (trunc (A / 19) );
  45.     K      := trunc ( (S - 17) / 25);
  46.     I      := S - trunc (S / 4) - trunc ( (S - K) / 3) + 19 * N + 15;
  47.     I      := I - 30 * (trunc (I / 30) );
  48.     I      := I - (trunc (I / 28) ) * (1 - (trunc (1 / 28) ) * (trunc (29 / (I + 1) ) ) * (trunc ( (21 - N) / 11) ) );
  49.     J      := A + trunc (A / 4) + I + 2 - S + trunc (S / 4);
  50.     J      := J - 7 * (trunc (J / 7) );
  51.     L      := I - J;
  52.     M      := 3 + trunc ( (L + 40) / 44);
  53.     D      := L + 28 - 31 * (trunc (M / 4) );
  54. RETURN (TO_DATE (lpad (D, 2, 0) || lpad (M, 2, 0) || lpad (A, 4, 0), 'DDMMYYYY') );
  55. END;
  56.    
  57. CREATE OR REPLACE FUNCTION data_pascoa( ano INTEGER )
  58. RETURNS DATE AS
  59. $BODY$
  60. DECLARE
  61.     mes   INTEGER;
  62.     dia   INTEGER;
  63.     sec   INTEGER;
  64.     I   INTEGER;
  65.     J   INTEGER;
  66.     K   INTEGER;
  67.     L   INTEGER;
  68.     N   INTEGER;
  69. BEGIN
  70.     sec := trunc( ano / 100 );
  71.     N := ano - 19 * (trunc( ano / 19 ) );
  72.     K := trunc( (sec - 17) / 25 );
  73.     I := sec - trunc( sec / 4 ) - trunc( (sec - K) / 3) + 19 * N + 15;
  74.     I := I - 30 * (trunc( I / 30 ) );
  75.     I := I - ( trunc( I / 28 ) ) * (1 - ( trunc( 1 / 28 ) ) * ( trunc(29 / (I + 1) ) ) * ( trunc( (21 - N) / 11) ) );
  76.     J := ano + trunc( ano / 4 ) + I + 2 - sec + trunc( sec / 4 );
  77.     J := J - 7 * ( trunc( J / 7 ) );
  78.     L := I - J;
  79.     mes := 3 + trunc( (L + 40) / 44 );
  80.     dia := L + 28 - 31 * ( trunc( mes / 4 ) );
  81.  
  82.     RETURN to_date( to_char( dia, '00') || to_char( mes, '00') || to_char( ano,'0000'), 'DDMMYYYY');
  83. END;
  84. $BODY$
  85. LANGUAGE plpgsql;
  86.    
  87. --
  88. -- FUNCAO PARA CALCULAR A DATA DO DOMINGO DE PASCOA
  89. -- USANDO O METODO DE CARTER
  90. --
  91. CREATE OR REPLACE FUNCTION data_pascoa( ano INTEGER )
  92. RETURNS DATE AS
  93. $BODY$
  94. DECLARE
  95.     B INTEGER;
  96.     D INTEGER;
  97.     E INTEGER;
  98.     Q INTEGER;
  99.     dia INTEGER;
  100.     mes INTEGER;
  101. BEGIN
  102.     IF (ano < 1900) OR (ano > 2099) THEN
  103.         -- O Metodo de Carter soh permite calcular a data
  104.         --da pascoa entre os anos de 1900 e 2099
  105.         RAISE EXCEPTION 'Ano invalido!';
  106.     END IF;
  107.  
  108.     B := 255 - 11 * ( ano % 19 );
  109.     D := ( (B - 21) % 30) + 21;
  110.  
  111.     IF( D > 38 ) THEN
  112.         D := D - 1;
  113.     END IF;
  114.  
  115.     E := ( ano + (ano / 4) + D + 1) % 7;
  116.     Q := D + 7 - E;
  117.  
  118.     IF( Q < 32 ) THEN
  119.         dia := Q;
  120.         mes := 3;
  121.     ELSE
  122.         dia := Q - 31;
  123.         mes := 4;
  124.     END IF;
  125.  
  126.     RETURN to_date( to_char( dia, '00') || to_char( mes, '00') || to_char( ano,'0000'), 'DDMMYYYY');
  127. END;
  128. $BODY$
  129. LANGUAGE plpgsql;
  130.    
  131. --
  132. -- TESTANDO A FUNCAO COM TODAS AS DATAS ENTRE 1900 e 2099
  133. --
  134. SELECT
  135.     ano,
  136.     data_pascoa( ano )
  137. FROM
  138.     generate_series( 1900, 2099 ) AS ano
  139. ORDER BY
  140.     ano;
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top