declare @dt1 datetime, @dt2 datetime, @yr int, @mth int, @day int, @yr_count int, @mth_count int, @day_count int, @month_end datetime, @month_begin datetime -- test cases select -- 30 days <== same yr/month --@dt1 = '20101202', @dt2 = '20101231' -- 1 month <== same yr/month --@dt1 = '20101201', @dt2 = '20101231' -- 1 year.<== same yr & diff mth, start date is 1st. --@dt1 = '20100101', @dt2 = '20101231' -- 2 month, 25 days<== same yr & start date is 1st. --@dt1 = '20100101', @dt2 = '20100325' -- 1 month, 1 day <== diff yr & diff mth --@dt1 = '20101202', @dt2 = '20110102' -- 3 months, 0 day. <== same yr & diff mth --@dt1 = '20100502', @dt2 = '20100801' -- 1 month, 30 day <== same yr & diff mth @dt1 = '20101102', @dt2 = '20101231' -- 2 months, 0 day <== diff yr & diff mth --@dt1 = '20101102', @dt2 = '20110101' -- 1yr, 2 months, 0 day <== diff yr & diff mth --@dt1 = '20101102', @dt2 = '20120101' select @dt1 as 'start date', @dt2 as 'end date' -- get all the differences for further analysis select @yr_count = datediff(year, @dt1,@dt2), @mth_count = datediff(month, @dt1,@dt2), @day_count = datediff(day, @dt1, @dt2) -- see if we should retain the year counter. if (@yr_count - 1 >= 0) begin select @yr_count = @yr_count - 1 end -- ensure that the month counter is less than 12. if @mth_count % 12 <> 0 begin select @mth_count = @mth_count % 12 end -- get first day of the month for the 2nd date. select @month_begin = cast(year(@dt2) as varchar(4)) + case when month(@dt2) > 9 then cast(month(@dt2) as varchar(2)) else '0' + cast(month(@dt2) as varchar(2)) end + '01' -- get the last day of the month for the 2nd date. select @month_end = dateadd(day, -1, dateadd(month, 1, @month_begin)) if (@dt1 = @month_begin) and (@dt2 = @month_end) begin select @mth_count = @mth_count + 1, @day_count = 0 --select @month_begin, @month_end end else begin if @dt1 > @month_begin select @month_begin = @dt1 --select @month_begin, @month_end, @dt2 -- if the end date is the last day of the month -- and the start date is the first day of the month, -- the day counter will be zero and the month counter increase by 1. if (@dt2 = @month_end) and day(@dt1) = 1 begin select @mth_count = @mth_count + 1, @day_count = 0 --select @day_count end else begin -- update the day counter. select @day_count = datediff(day, @month_begin, @dt2) + 1 end end if (@mth_count <> 0) and (@mth_count % 12 = 0) begin declare @i int select @i = @yr_count +(@mth_count / 12) select @mth_count = 0, @yr_count = @i end if month(@dt1) <> month(@dt2) begin if day(@dt1) <> 1 and @day_count > 0 select @day_count = @day_count - 1 end -- ---------------------------------------------- select @yr_count as '# of years', @mth_count as '# of months', @day_count as '# of days'
Friday, January 28, 2011
Get the number of years, months & days for the given 2 dates
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment