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