Sandro Bizioli


Chi sogna di giorno conosce molte cose che sfuggono a chi sogna soltanto di notte. (E.A.Poe)
Mappa

Calcolare il giorno di Pasqua (EasterDay)

Ci siamo quasi, fra qualche giorno sarà Pasqua; ma esattamente quale giorno? E l'anno prossimo?
Beh, per risolvere questo esistenziale problema, potremmo ricorrere a questa semplice funzione.

 

/*
-- Author:  Sandro Bizioli
-- Create date: 20070215
-- Description: Recupera la data del giorno di Pasqua per l'anno
--    indicato
-- Param:  @Anno Anno di riperimento, se omesso il corrente.
-- Note:  La funzione calcola il giorno di Pasqua per gli anni
--    dal 1900 al 2079
*/
CREATE FUNCTION fnEasterDay(@Anno as int = null)
 RETURNS @myReturn TABLE (
       EasterDay Smalldatetime null
       )
AS
BEGIN
 -- Verifico che l'anno sia corretto
 set @anno = coalesce(@anno, year(getdate()))
 if not @anno between 1900 and 2079
  begin
   insert into @myReturn values (null)
   return
  end 

 -- Imposto le variabili da utilizzare
 declare @y int, @a int, @b int, @c int, @d int
 declare @Easter as smalldatetime

 set @y = @anno - 1900
 set @a = (7 * (@y % 19) + 1) / 19
 set @b = (11 * (@y % 19) + 4 - @a) % 29
 set @c = (@y + @y / 4 + 31 - @b) % 7
 set @d = 25 - @b - @c
 
 If @d > 0  
  set @easter = convert(datetime, cast(@anno as char(4)) + '04' + substring('0' + cast(@d as char(2)),1,2), 112)     
 Else
  set @easter = convert(smalldatetime, cast(@anno as char(4)) + '03' + substring('0' + cast(@d+31 as char(2)),1,2), 112)
 
 -- Restituisco la tabella vera e propria  
 INSERT INTO @myReturn VALUES (@easter)
 RETURN
 
END
GO

Una volta creata la nostra funzione basterà richiamarla indicando l'anno di riferimento. Se NULL viene preso l'anno corrente.

Select * From fnEasterDay(2007)

/* Output
EasterDay
-----------------------
2007-04-08 00:00:00
*/

Ah, dimenticavo. Quest'anno Pasqua è l'8 Aprile. Auguri a tutti.

Categoria: SQL Server
giovedì, 15 feb 2007 Ore. 16.36
Statistiche
  • Views Home Page: 104.951
  • Views Posts: 522.329
  • Views Gallerie: 84.594
  • n° Posts: 227
  • n° Commenti: 222
Copyright © 2002-2007 - Blogs 2.0
dotNetHell.it | Home Page Blogs
ASP.NET 2.0 Windows 2003