“How to calculate the first date of the current, previous & next month” ? I have seen this question many times in different blogs and there are multiple approaches that we have been following to find it.
For Example
--SQL Server 2005/2008 DECLARE @DATE DATETIME SET @DATE='2012-09-10' --First date of the Previous Month SELECT CONVERT(VARCHAR(10),DATEADD(MONTH, DATEDIFF(MONTH,0,@DATE)-1,0),120) AS [Previous Month] --First date of the Current Month SELECT CONVERT(VARCHAR(10),DATEADD(MONTH, DATEDIFF(MONTH,0,@DATE),0),120) AS [Current Month] --First date of the Next Month SELECT CONVERT(VARCHAR(10),DATEADD(MONTH, DATEDIFF(MONTH,0,@DATE)+1,0),120) AS [Next Month] Previous Month -------------- 2012-08-01 (1 row(s) affected) Current Month ------------- 2012-09-01 (1 row(s) affected) Next Month ---------- 2012-10-01 (1 row(s) affected)
In SQL Server 2012, we can calculate it with the help of a new built in function namely EOMONTH.
Example-1 :
In this example, I calculated the last date of the previous month and later added one more day to it to make the first day of the current month.
Declare @Date as varchar(10) ='2012-09-10' --First date of the Current Month Select DateAdd(day,1,EOMONTH(Getdate(),-1)) as [Current Month] Current Month ------------- 2012-09-01 (1 row(s) affected)
Example-2 : FOMONTH
In this example, we will create a function FOMONTH and will use it same as EOMONTH in SQL server 2012.
CREATE Function [dbo].[FOMONTH]
(@start_date date, @month_to_add int=0)
Returns Date
AS
BEGIN
RETURN DATEADD(DAY,1,EOMONTH(@start_date,@month_to_add-1))
END
GO
--First day of the Previous Month
Select dbo.[FOMONTH] (Getdate(),-1) AS [Previous Month]
--First day of the Current Month
Select dbo.[FOMONTH] ('2012-09-10',0) AS [Current Month]
--First day of the Next Month
Select dbo.[FOMONTH] (Getdate(),1) AS [Next Month]
--First day of the Current Month WITH DEFAULT VALUE
Select dbo.[FOMONTH] (Getdate(),DEFAULT) AS [Current Month]
Previous Month
--------------
2012-08-01
(1 row(s) affected)
Current Month
-------------
2012-09-01
(1 row(s) affected)
Next Month
----------
2012-10-01
(1 row(s) affected)
Current Month
-------------
2012-09-01
(1 row(s) affected)