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)