datetimelanguage-agnosticcalendarcomputus

Function to return date of Easter for the given year


So, here's a funny little programming challenge. I was writing a quick method to determine all the market holidays for a particular year, and then I started reading about Easter and discovered just how crazy* the logic is for determining its date--the first Sunday after the Paschal Full Moon following the spring equinox! Does anybody know of an existing function to calculate the date of Easter for a given year?

Granted, it's probably not all that hard to do; I just figured I'd ask in case somebody's already done this. (And that seems very likely.)

UPDATE: Actually, I'm really looking for the date of Good Friday (the Friday before Easter)... I just figured Easter would get me there. And since I'm in the U.S., I assume I'm looking for the Catholic Easter? But perhaps someone can correct me on that if I'm wrong.

*By "crazy" I meant, like, involved. Not anything offensive...


Solution

  • in SQL Server Easter Sunday would look like this, scroll down for Good Friday

    CREATE FUNCTION dbo.GetEasterSunday 
    ( @Y INT ) 
    RETURNS SMALLDATETIME 
    AS 
    BEGIN 
        DECLARE     @EpactCalc INT,  
            @PaschalDaysCalc INT, 
            @NumOfDaysToSunday INT, 
            @EasterMonth INT, 
            @EasterDay INT 
    
        SET @EpactCalc = (24 + 19 * (@Y % 19)) % 30 
        SET @PaschalDaysCalc = @EpactCalc - (@EpactCalc / 28) 
        SET @NumOfDaysToSunday = @PaschalDaysCalc - ( 
            (@Y + @Y / 4 + @PaschalDaysCalc - 13) % 7 
        ) 
    
        SET @EasterMonth = 3 + (@NumOfDaysToSunday + 40) / 44 
    
        SET @EasterDay = @NumOfDaysToSunday + 28 - ( 
            31 * (@EasterMonth / 4) 
        ) 
    
        RETURN 
        ( 
            SELECT CONVERT 
            (  SMALLDATETIME, 
                     RTRIM(@Y)  
                + RIGHT('0'+RTRIM(@EasterMonth), 2)  
                + RIGHT('0'+RTRIM(@EasterDay), 2)  
            ) 
        ) 
    
    END 
    GO
    

    Good Friday is like this and it uses the Easter function above

    CREATE FUNCTION dbo.GetGoodFriday 
    ( 
        @Y INT 
    ) 
    RETURNS SMALLDATETIME 
    AS 
    BEGIN 
        RETURN (SELECT dbo.GetEasterSunday(@Y) - 2) 
    END 
    GO
    

    From here: http://web.archive.org/web/20070611150639/http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-calendar-table.html