 |
::
Newsletter |
 |
|
Gli indirizzi registrati NON saranno ceduti a
terzi, nè utilizzati per scopi differenti da quelli indicati. |
|
Ci sono almeno due algoritmi con cui -
chi prima, chi poi - tutti ci siamo trovati a doverci confrontare:
- Il calcolo del codice fiscale,
- il calcolo del Lunedì di Pasqua
Sul primo si è scritto molto, ed io
stesso ho contribuito ad aumentare le pagine ad esso dedicato
pubblicando su Visual
Basic & .NET Journal l'articolo "Calcolo
del codice fiscale in VB6" nei primi mesi del 2004.
Sulla Pasqua, invece, si trovano molti meno esempi ed articoli,
tantè che spesso si tende ad inserire nei propri programmi un elenco
dei giorni di Pasqua dei successivi 20 anni senza implmentare alcun
algoritmo di calcolo.
Provo a colmare questa lacuna, anche
se - come si vedrà - l'algoritmo risulta essere parecchio empirico e
richiede "aggiustamenti" per poter funzionare correttamente.
In generale diciamo che
- Il giorno di Pasqua (e di
conseguenza il Lunedì di Pasqua) cade nella prima Domenica che
succede al plenilunio immediatamente successivo all'equinozio di
primavera.
- per ragioni astronomiche la
data può variare tra il 22 di Marzo ed il 25 di Aprile
Il calcolo si basa su tre variabili,
due delle quali sono il risultato di una tabella compilata a priori e
statica che ha lo scopo di "aggiustare" il calcolo, la terza
è l'anno del quale si vuole conoscere la data del giorno di Pasqua.
1583-1699 |
22 |
2 |
1700-1799 |
23 |
3 |
1800-1899 |
23 |
4 |
1900-2099 |
24 |
5 |
2100-2199 |
24 |
6 |
2200-2299 |
25 |
0 |
2300-2399 |
26 |
1 |
Possedendo i dati di questa tabella,
è sufficiente eseguire cinque divisioni e considerare i loro
resti per ottenere il risultato.desiderato. Come si vede dall'esempio
che riporto di seguito, il risultato è un numero che può essere
superiore o inferiore a 31. Se è inferiore a 31, allora si considera
quel numero come il giorno del mese di Marzo, in caso contrario, si
sottre 31 e si considera come mese Aprile.
Riporto qui di seguito una stored
procedure per SQL server che realizza tale algoritmo.
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 = ((16 * @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)
|
Lascio a voi l'esercizio di
realizzare la stessa procedura con altri linguaggi di
programmazione...Buon divertimento!
|