'How to get the First day and last day of the month from given month number and year in SQL Server
I have a month number and year: month 2 and year 2022.
How can I get the first day of that month like 2022-02-01 and last day of month 2022-02-28?
I have seen many posts on getting first and last date of month based on given date or the current date, but I need it based on given month and year.
Thanks in advance
Here is my stored procedure:
ALTER PROCEDURE [dbo].[Rpt_ItemsSales_DayMonthYear_year]-- 2022
@year int = NULL
AS
;WITH months(MonthNumber) AS
(
SELECT 1
UNION ALL
SELECT MonthNumber + 1
FROM months
WHERE MonthNumber < 12
)
SELECT
SalesPos_Dtls.ItemName,
SUM(SalesPos_Dtls.Qty) AS SumQty,
SUM(SalesPos_Dtls.TotalPrice) AS SumTotal,
SalesPos_Dtls.ItemCode,
DATENAME(month, DATEADD(month, m.MonthNumber, 0) - 1) AS MonthName,
m.MonthNumber
FROM
months AS m
LEFT JOIN
SalesPos ON MONTH(SalesPos.StartDate) = m.MonthNumber
AND (status = 'IsPosted')
AND (@year = YEAR(salespos.startdate) OR @year IS NULL)
LEFT JOIN
[dbo].SalesPos_Dtls ON SalesPos.ID = SalesPos_Dtls.OrderId
GROUP BY
m.MonthNumber, dbo.SalesPos_Dtls.ItemName, dbo.SalesPos_Dtls.ItemCode
And this is as far as I got
ALTER PROCEDURE [dbo].[Rpt_ItemsSales_DayMonthYear_year] --2022,1
@year int = NULL,
@month int = NULL
AS
DECLARE @yearr int = @year
DECLARE @monthh int = @month
;WITH months(MonthNumber) AS
(
SELECT 1
UNION ALL
SELECT MonthNumber + 1
FROM months
WHERE MonthNumber < 12
)
SELECT
SalesPos_Dtls.ItemName,
SUM(SalesPos_Dtls.Qty) AS SumQty,
SUM(SalesPos_Dtls.TotalPrice) AS SumTotal,
SalesPos_Dtls.ItemCode,
DATENAME(month, DATEADD(month, m.MonthNumber, 0) - 1) AS MonthName,
m.MonthNumber,
DATEFROMPARTS (@yearr, @monthh, 1) AS MonthStart,
EOMONTH (DATEFROMPARTS (@yearr, @monthh, 1)) AS MonthEnd
FROM
months AS m
LEFT JOIN
SalesPos ON MONTH(SalesPos.StartDate) = m.MonthNumber
AND (status = 'IsPosted')
AND (@year = YEAR(salespos.startdate) OR @year IS NULL)
LEFT JOIN
[dbo].SalesPos_Dtls ON SalesPos.ID = SalesPos_Dtls.OrderId
WHERE
(MONTH(SalesPos.StartDate) = @month OR @month IS NULL)
GROUP BY
m.MonthNumber, dbo.SalesPos_Dtls.ItemName, dbo.SalesPos_Dtls.ItemCode
Screenshot with the sample data:

But I want my data this way :
هوت دوج لارج 3.0000 75.0000
76 January 1 2022-1-01 2022-1-31
هوت دوج ميديم 1.0000 20.0000 77 January 1 2022-1-01 2022-1-31
NULL NULL NULL NULL February 2 2022-2-01 2022-2-28
NULL NULL NULL NULL March 3 NULL 2022-3-01 2022-3-31
Solution 1:[1]
SET DATEFIRST 1
DECLARE @Month smallint= 3, @Year smallint = 2022;
/*First and Last day of month as DATE */
select DATEFROMPARTS(@Year, @MONTH, 1)FirstDayOfMonth , EOMONTH(DATEFROMPARTS(@Year, @MONTH, 1)) LastDayofMonth
/*First and Last Weekday of Month */
select DATEPART( dw, DATEFROMPARTS(@Year, @MONTH, 1) ) FirstWeekDayOfMonth , DATEPART(dw, (EOMONTH(DATEFROMPARTS(@Year, @MONTH, 1)))) LastWeekDayofMonth
Solution 2:[2]
i dont know if this is the right way to update the question but here is the solution that worked for me.
SELECT DATEADD(month, DATEDIFF(month, 0, @mydate), 0) AS StartOfMonth
SELECT EOMONTH(@mydate) as LastOFMonth
And thanks edit: this is the stored procedure. all i wanted is to have 2 columns infront of each item that have the firstday of the month and the last day witch this item was purchased. i hope this and the stored procedure explain what i mean.
ALTER proc [dbo].[Rpt_ItemsSales_DayMonthYear_year]--Rpt_ItemsSales_DayMonthYear_year 2022
@year int=null
as
;WITH months(MonthNumber) AS
(
SELECT 1
UNION ALL
SELECT MonthNumber+1
FROM months
WHERE MonthNumber < 12
)
select SalesPos_Dtls.ItemName,sum(SalesPos_Dtls.Qty) as SumQty,sum(SalesPos_Dtls.TotalPrice) as SumTotal,SalesPos_Dtls.ItemCode,DateName( month , DateAdd( month , m.MonthNumber , 0 ) - 1 ) as MonthName,
m.MonthNumber, cast(DATEADD(month, DATEDIFF(month, 0, SalesPos.StartDate), 0) as date) AS StartOfMonth,EOMONTH(SalesPos.StartDate) as LastOFMonth
from months as m
left join SalesPos on month(SalesPos.StartDate) = m.MonthNumber and (status = 'IsPosted') and (@year = year(salespos.startdate) or @year is null)
left JOIN [dbo].SalesPos_Dtls on SalesPos.ID=SalesPos_Dtls.OrderId
group by m.MonthNumber,dbo.SalesPos_Dtls.ItemName,dbo.SalesPos_Dtls.ItemCode,cast(DATEADD(month, DATEDIFF(month, 0, SalesPos.StartDate), 0) as date),EOMONTH(SalesPos.StartDate)
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 |
