• Interesting, John; it worked fine for me.

    Actually, I had to create a bit of vb-based code a while ago for calculating Easter correctly, and then ported it into a SQL function too. The function DASUN has provided gave the same results as mine for all years between 1800 and 9999, so if you want an alternative, try my version as below:

    CREATE FUNCTION [dbo].[fnEasterSunday]

    (

    @YearVal int

    )

    RETURNS datetime

    AS

    BEGIN

    DECLARE @EasterDate datetime

    declare @a int,

    @b-2 int,

    @C int,

    @d int,

    @e int,

    @f int,

    @g int,

    @h int,

    @j-2 int,

    @m int,

    @k int,

    @mth int,

    @dy int,

    @easter datetime

    set @a = @yearval - (floor(@yearval/19) * 19)

    set @b-2 = floor(@yearval/100)

    set @C = @yearval - (@b * 100)

    set @d = floor(@b/4)

    set @e = @b-2 - (@d * 4)

    set @f = floor(@c/4)

    set @g = @C - (@f*4)

    set @h = floor(((8 * @b-2) + 13)/25)

    set @j-2 = ((19 * @a) + (@b - @d - @h) + 15) - (floor(((19 * @a) + (@b - @d - @h) + 15)/30) * 30)

    set @m = floor((@a + 11 * @j-2)/319)

    set @k = ((2 * @e) + (2 * @f) - @g - @j-2 + @m + 32) - (floor(((2 * @e) + (2 * @f) - @g - @j-2 + @m + 32)/7) * 7)

    set @mth = floor((@j - @m + @k + 90)/25)

    set @dy = (@j - @m + @k + 19 + @mth) - (floor((@j - @m + @k + 19 + @mth) /32) * 32)

    set @easter = convert(datetime, str(@yearval) + '-' + str(@mth) + '-' + str(@dy), 120)

    if datepart(dw, @easter) = 1

    begin

    select @easterdate = @easter

    end

    else

    begin

    select @easterdate = dateadd(d, 8 - datepart(dw, @easter), @easter)

    end

    RETURN @EasterDate

    END

    And you might want to have a look at this website for the full details of the calculation.

    Hope this helps

    Semper in excretia, suus solum profundum variat