This function will return the last day of a given month based upon the date passed in.
-------------------------------------------------
--Create Function to return the last day of the
--week based upon the date passed in.
--
--You pass in a Date and it return
--the Date for last day of the week
-------------------------------------------------
CREATE FUNCTION [dbo].[xGetLastDayOfMonth](@Date DateTime)
RETURNS DateTime
AS
BEGIN
DECLARE @DayOfMonth INT
DECLARE @AddOneMonthToDate DateTime
-- Add one month to the date passed in
SET @AddOneMonthToDate = DateAdd(m,1,@Date)
-- Get the day number of @AddOneMonthToDate
-- When adding one Month to the passed in Date
-- we could end up with a different day than
-- the original month. Add one month to 1/31/2011
-- and we get 2/28/2011. We want to make sure
-- we get day number in the next month.
SET @DayOfMonth = DAY(@AddOneMonthToDate)
-- We will now subtract the @DayOfMonth
-- from the @AddOneMonthToDate. Since there is no
-- such thing as a month with a ZERO, it rolls
-- back to the last day of the prior month.
-- if you were to use 1/29/2000,1/30/2000 or 1/31/2000
-- as the date passed in an we add one month
-- to that we would get 2/28/2000 back. Since
-- we told it to add one month, it only adds one
-- month to and makes sure we get back a valid
-- date.
-- The @dayOfMonth that we then get from this
-- is 28.
-- We then subtract 28 from 2/28/2000.
-- Since we can't have 2/00/2000 it goes to the
-- prior day and the result in 1/31/2000.
RETURN DATEADD(d, -@DayOfMonth, @AddOneMonthToDate)
-- Of course we could just use this one line below
-- to do all the work for us, instead of the previous
-- five lines. But then that wouldn't be fun, eh?
/*
RETURN DATEADD(d
, -DAY( DATEADD(m,1,@date) )
, DATEADD(m,1,@date)
)
*/
END
GO
-------------------------------------------------
--Now we will check to see if the code works
-------------------------------------------------
-- Should return 12/31/2011
Select dbo.xGetLastDayOfMonth('2011-12-25')
No comments:
Post a Comment