การหาวันเริ่มต้นและวันสุดท้ายของเดือนปัจจุบัน

บทความนี้ผู้เขียนขอเรียกเป็น “ซีรีย์คิวรี่ตามคำขอ” เพราะผู้เขียนได้รับการสอบถามถึงการสืบค้นวันสุดท้ายของเดือนปัจจุบัน ทั้งที่ Microsoft SQL Server นั้นมีฟังก์ชั่น EOMONTH (End of Month) มาตั้งแต่เวอร์ชั่น 2012
การหาวันเริ่มต้นและวันสุดท้ายของเดือนปัจจุบัน
ทักษะ (ระบุได้หลายทักษะ)

การหาวันเริ่มต้นและวันสุดท้ายของเดือนปัจจุบัน

บทความนี้ผู้เขียนขอเรียกเป็น “ซีรีย์คิวรี่ตามคำขอ” เพราะผู้เขียนได้รับการสอบถามถึงการสืบค้นวันสุดท้ายของเดือนปัจจุบัน ทั้งที่ Microsoft SQL Server นั้นมีฟังก์ชั่น EOMONTH (End of Month) มาตั้งแต่เวอร์ชั่น 2012 ตามลิ้งก์ต่อไปนี้ https://docs.microsoft.com/en-us/sql/t-sql/functions/eomonth-transact-sql?view=sql-server-2017

ฟังก์ชัน EOMONTH

มี Syntax ต่อไปนี้

 


EOMONTH ( start_date [, month_to_add ] )



โดย start_date คือวันใดก็ได้ในเดือนที่ต้องการหาวันสุดท้ายของเดือน และ month_to_add คือ เลขจำนวนเดือนที่ต้องการบวกเพิ่มให้แก่ start_date
สามารถทำความเข้าใจได้ผ่านตัวอย่างต่อไปนี้

 


SET NOCOUNT ON;

DECLARE @myDate date=GETDATE();

SELECT @myDate as Today;

SELECT EOMONTH(@myDate,-1) as [End of last Month];
SELECT EOMONTH(@myDate) as [End of this Month];
SELECT EOMONTH(@myDate,1) as [End of next Month];
 


ผลลัพธ์ที่ได้คือ (หมายเหตุ วันที่ทำการทดสอบคือ 29 มิถุนายน 2562)

 


Today
----------
2019-06-29
 
End of last Month
-----------------
2019-05-31
 
End of this Month
-----------------
2019-06-30
 
End of next Month
-----------------
2019-07-31
 


 

ไม่ยากเลยใช่ไหมครับ แต่ผู้เขียนอดสงสัยไม่ได้ว่า Microsoft เตรียมฟังก์ชัน EOMONTH ไว้ให้ แต่ทำไมถึงไม่มี BOMONTH (Begin of Month) มาให้บ้าง ผู้เขียนมักสร้างฟังก์ชัน BOMONTH ขึ้นมาใช้งานและอยากจะนำมาแบ่งปันให้ใช้งานกัน

ฟังก์ชัน BOMONTH

แนวคิดง่ายมากครับ ผู้เขียนจะทำการลดจากวันที่ป้อนลงไปหนึ่งเดือน แล้วทำการหา EOMONTH จากวันดังกล่าวจากนั้นบวกวันเพิ่มไปอีก 1 วันก็จะกลายเป็นวันแรกของเดือนจากวันที่ป้อน ดังนี้

 


ALTER FUNCTION dbo.BOMONTH(@start_date date,@month_to_add int=0) RETURNS date
AS
BEGIN
       DECLARE @result date
       SELECT @result=DATEADD(DAY,1,EOMONTH(@start_date,@month_to_add-1))
       RETURN @result
END
 


เรามาทดสอบฟังก์ชันที่เขียนขึ้นเองดังสคริปต์ต่อไปนี้

 


SET NOCOUNT ON;
 
DECLARE @myDate date=GETDATE();
 
SELECT @myDate as Today;
 
SELECT dbo.BOMONTH(@myDate,-1) as [Begin of last Month];
SELECT dbo.BOMONTH(@myDate,DEFAULT) as [Begin of this Month];
SELECT dbo.BOMONTH(@myDate,1) as [Begin of next Month];
 
 


ผลลัพธ์ที่ได้ (หมายเหตุ วันที่ทำการทดสอบคือ 29 มิถุนายน 2562)

 


Today
----------
2019-06-29
 
Begin of last Month
-------------------
2019-05-01
 
Begin of this Month
-------------------
2019-06-01
 
Begin of next Month
-------------------
2019-07-01
 


บทความนี้น่าจะเป็นประโยชน์สำหรับใครที่ต้องการหาวันแรกและวันสุดท้ายของเดือนผ่านฟังก์ชันของ Microsoft SQL Server แล้วผู้เขียนจะรอคำถามต่อไป แล้วนำมาเขียนคิวรี่ให้ดูกันครับ