i need find anniversary date , anniversary year of employees , send email in every 14 days.but have problem last week of december when using following query if start date , end date in different years.
select * resource (datepart(dayofyear,joindate) between datepart(dayofyear,getdate()) , datepart(dayofyear,dateadd(day,14,getdate())))
instead of comparing dayofyear (which resets 0 @ jan 1st , reason query breaks within 14 days of end of year) update employee's joindate current year purpose of query , compare actual dates
select * resource -- add number of years difference between joindate , current year dateadd(year,datediff(year,joindate,getdate()),joindate) -- compare range "today" between getdate() -- 14 days today , dateadd(day,14,getdate()) -- duplicate following year or dateadd(year,datediff(year,joindate,getdate())+1,joindate) -- 2016-1-1 between getdate() , dateadd(day,14,getdate()) test query:
declare @joindate datetime='2012-1-1' declare @today datetime = '2015-12-26' select @joindate dateadd(year,datediff(year,@joindate,@today),@joindate) -- 2015-1-1 between @today -- 2015-12-26 , dateadd(day,14,@today) -- 2016-01-09 or dateadd(year,datediff(year,@joindate,@today)+1,@joindate) -- 2016-1-1 between @today -- 2015-12-26 , dateadd(day,14,@today) -- 2016-01-09 (h/t @damien_the_unbeliever simple fix)
the above correctly selects joindate in first week of jan (note i've had fudge @today ive not managed invent time travel).
the above solution should solve issue leap years hiding in original solution.
update
you expressed in comments requirement select anniversarydate , years of service, need apply case logic determine whether add 1 (year or date) select
select *, case when dateadd(year,datediff(year,joindate,getdate()),joindate) < getdate() datediff(year,joindate,getdate())+1 else datediff(year,joindate,getdate()) end [years], case when dateadd(year,datediff(year,joindate,getdate()),joindate) < getdate() dateadd(year,datediff(year,joindate,getdate())+1,joindate) else dateadd(year,datediff(year,joindate,getdate()),joindate) end [anniversarydate] .... // etc
Comments
Post a Comment