• Here's a fix to Michael's:

    declare @emp table

    (empid int identity(1,1) primary key clustered, dob datetime not null)

    insert into @emp (dob)

    SELECT convert(datetime,'1962-01-01 00:00:00.000') AS dob UNION ALL

    SELECT convert(datetime,'1958-12-31 00:00:00.000') AS dob UNION ALL

    SELECT convert(datetime,'1960-02-29 00:00:00.000') AS dob UNION ALL

    SELECT convert(datetime,'1990-08-30 00:00:00.000') AS dob UNION ALL

    SELECT convert(datetime,'1990-09-03 00:00:00.000') AS dob UNION ALL

    SELECT convert(datetime,'1990-09-04 00:00:00.000') AS dob UNION ALL

    SELECT convert(datetime,'1985-09-05 00:00:00.000') AS dob UNION ALL

    SELECT convert(datetime,'1985-09-10 00:00:00.000') AS dob UNION ALL

    SELECT convert(datetime,'1985-09-11 00:00:00.000')

    select

    a.*,

    BirthdayThisYear = CASE

    WHEN dateadd(yy,datediff(yy,dob,getdate()),dob) < getdate()

    THEN dateadd(yy,datediff(yy,dob,getdate())+1,dob)

    ELSE dateadd(yy,datediff(yy,dob,getdate()),dob)

    END

    from

    @emp a

    where

    --Birthday between tomorrow and 7 days from today

    datediff(dd,getdate() ,(CASE

    WHEN dateadd(yy,datediff(yy,dob,getdate()),dob) < getdate()

    THEN dateadd(yy,datediff(yy,dob,getdate())+1,dob)

    ELSE dateadd(yy,datediff(yy,dob,getdate()),dob)

    END))

    between 1 and 7

    Still looks a bit ugly.

    All this does is always compare against the NEXT birthday (never a previous one the same year).