O cálculo da data da Páscoa, também conhecido como Computus em latim, é fundamental no calendário cristão desde os primórdios da cristandade, tornando-se definido na Idade Média.
A Páscoa é celebrada no primeiro domingo após a primeira lua cheia que ocorre depois do equinócio da Primavera (no hemisfério norte, outono no hemisfério sul), ou seja, é equivalente à antiga regra de que seria o primeiro Domingo após o 14º dia do mês lunar de Nisan. Poderá assim ocorrer entre 22 de Março e 25 de Abril.
CREATE OR REPLACE FUNCTION CP.PASCOA (ANO NUMBER)
RETURN DATE
AS
X NUMBER;
Y NUMBER;
A NUMBER;
B NUMBER;
C NUMBER;
D NUMBER;
E NUMBER;
DIA NUMBER;
MES NUMBER;
DATA_PASCOA DATE;
BEGIN
IF ANO > 1581 AND ANO < 1700
THEN
X := 22;
Y := 2;
ELSIF ANO > 1699 AND ANO < 1800
THEN
X := 23;
Y := 3;
ELSIF ANO > 1799 AND ANO < 1900
THEN
X := 24;
Y := 4;
ELSIF ANO > 1899 AND ANO < 2100
THEN
X := 24;
Y := 5;
ELSIF ANO > 2099 AND ANO < 2200
THEN
X := 24;
Y := 6;
ELSIF ANO > 2199 AND ANO < 2300
THEN
X := 25;
Y := 7;
END IF;
A := ANO MOD 19;
B := ANO MOD 4;
C := ANO MOD 7;
D := (19 * A + X) MOD 30;
E := (2 * B + 4 * C + 6 * D + Y) MOD 7;
IF (D + E) > 9
THEN
DIA := D + E - 9;
MES := 4;
ELSE
DIA := D + E + 22;
MES := 3;
END IF;
DATA_PASCOA := TO_DATE (DIA || '-' || MES || '-' || ANO, 'DD-MM-YYYY');
IF MES = 4 AND DIA = 26
THEN
DATA_PASCOA := DATA_PASCOA - 7;
END IF;
IF MES = 4 AND DIA = 25 AND D = 28 AND A > 10
THEN
DIA := 18;
DATA_PASCOA := TO_DATE (DIA || '-' || MES || '-' || ANO, 'DD-MM-YYYY');
END IF;
RETURN TRUNC (DATA_PASCOA);
END;
/
P.S. Para se calcular outros feriados móveis temos:
Carnaval = Páscoa - 47 dias
Sexta-feira Santa = Páscoa - 2 dias
Corpus Christi = Páscoa + 60 dias
Referências:
http://www.inf.ufrgs.br/~cabral/Pascoa.html
http://pt.wikipedia.org/wiki/Cálculo_da_Páscoa
http://www.inf.ufrgs.br/~cabral/tabela_pascoa.html