Calcolo del giorno di Pasqua (2)

Posted martedì 8 febbraio 2005 9.34 by lorenzo

Un lettore di questo blog che non si è firmato mi ha segnalato un comportamento anomalo nella stored procedure che ho pubblicato qualche tempo fa per calcolare il giorno di Pasqua.
L'anomalia segnalata è docuta ad una svista nel codice che compromette la correttezza del calcolo per gli anni precedenti al 2000. In pratica era presente un 16 anziché un 19...

Ecco la stored procedure riveduta e corretta:

CREATE PROCEDURE GetPasqua (
@Anno INT,
@Pasqua DATETIME OUTPUT)
AS
DECLARE @T1 INT
DECLARE @T2 INT
DECLARE @T3 INT
DECLARE @T4 INT
DECLARE @T5 INT
DECLARE @Var1 INT
DECLARE @Var2 INT
DECLARE @NumGG INT

SET @T1 = 0
SET @T2 = 0
SET @T3 = 0
SET @T4 = 0
SET @T5 = 0


IF @Anno < 1900 OR @Anno > 2199
BEGIN
RAISERROR ('La procedura gestisce solo le date comprese tra il 1500 ed il 2199', 16, 1)
END 

IF @Anno >= 1900 AND @Anno <= 2099
BEGIN
SET @Var1 = 24
SET @Var2 = 5
END
IF @Anno >= 2100 AND @Anno <= 2199
BEGIN
SET @Var1 = 24
SET @Var2 = 6
END


SET @T1 = @Anno % 19
SET @T2 = @Anno % 4
SET @T3 = @Anno % 7
SET @T4 = ((19 * @T1) + @Var1) % 30
SET @T5 = ((2 * @T2) + (4 * @T3) + (6 * @T4) + @Var2) % 7

SET @NumGG = 22 + @T4 + @T5

IF @NumGG <= 31
BEGIN
SET @Pasqua = CAST(CAST(@Anno AS VARCHAR(4)) + '03' + RIGHT('0' + CAST(@NumGG AS VARCHAR(2)), 2) AS DATETIME)
END ELSE
BEGIN
SET @NumGG = @NumGG - 31
SET @Pasqua = CAST(CAST(@Anno AS VARCHAR(4)) + '04' + RIGHT('0' + CAST(@NumGG AS VARCHAR(2)), 2) AS DATETIME)
END

RETURN(0)

La cosa interessante è che quel lettore mi ha suggerito un modo alternativo per ottenere il medesimo risultato allegando la stored procedure che riporto di seguito:

CREATE PROCEDURE GetPasqua (
@Anno INT,
@Pasqua DATETIME OUTPUT)
AS
DECLARE @Sec INT
DECLARE @H INT
DECLARE @I INT
DECLARE @J INT
DECLARE @L INT
DECLARE @Mese INT
DECLARE @Giorno INT

SET @Sec = @anno % 19
SET @H = (
24+19*@Sec) % 30
SET @I = @H - CEILING(@H/28)
set @J = (@ANNO + ceiling(@ANNO/4) + @I -13) % 7
SET @L = @i - @j
SET @Mese = 3 + ceiling((@l+40)/44)
SET @Giorno = @L + 28 -31*CEILING(@Mese/4)

IF @Mese > 3
BEGIN
SET @Pasqua = CAST(CAST(@Anno AS VARCHAR(4)) + '04' + RIGHT('0' + CAST(@Giorno AS VARCHAR(2)), 2) AS DATETIME)
END ELSE
BEGIN
SET @Pasqua = CAST(CAST(@Anno AS VARCHAR(4)) + '03' + RIGHT('0' + CAST(@Giorno AS VARCHAR(2)), 2) AS DATETIME)
END
RETURN(0)

 

Comments

No Comments