T-SQL, Function End of Month

เหมือนเดิม function ที่น่าจะต้องใช้บ่อยๆ ครับ
คือ function End Of Month หรือ หาวันสิ้นเดือน ครับ ก็ไม่ยากอะไรหรอกครับ
แต่มันก็ใช้บ่อยๆ เขียนไว้ใช้ ก็สะดวกดี ไม่จำเป็นต้องเขียนใหม่ทุกครั้ง

สิ่งที่ต้องการ คือ ป้อน input เป็น วันที่ แล้ว return เป็น วันที่สิ้นเดือน ของเดือน นั้น

หลักการที่ผมใช้คือ
1. หาวันที่ 1 ของเดือน ของวันที่ input
2. บวก ไป 1 เดือน ได้วันที่ 1 ของเดือนถัดไป
3. ลบ 1 วัน ได้วันสิ้นเดือน ของ วันที่ input

แค่นี้ครับ

ต่อไป มาดู code T-SQL กันครับ
เอาตาม concept ที่ว่า ไม่ได้ พลิกแพลงอะไรมากครับ ส่วนใครจะเอาำไป optimize อย่างไร
ไม่ว่ากัน อันนี้เป็น Code ของ SQL Server 2005

ใน code จะมีการ set เวลา ให้เป็น 0:00 ด้วยครับ

CREAT FUNCTION [app_main].[fnEndOfMonth]
(
@dateint smalldatetime
)
RETURNS smalldatetime
AS
BEGIN
-- Declare the return variable here
DECLARE @DOut smalldatetime --for output date
DECLARE @d int --for day
DECLARE @h int --for hour
DECLARE @m int --for minute
-- Add the T-SQL statements to compute the return value here
IF @dateint IS NULL
BEGIN
SET @dateint = GETDATE()
END

SET @d = (DAY(@dateint )-1) * -1 --GET number of day for minus to 1st date
SET @h = DATEPART ( hh , @dateint )*-1 --Get number of hour
SET @m = DATEPART ( mi , @dateint )*-1 --Get numer of minute

SET @DOut=DATEADD(day,@d,@dateint ) --Get 1st Date of month on input date
SET @DOut=DATEADD(month,1,@DOut) --Get 1st Date of next month
SET @DOut=DATEADD(day,-1,@DOut) -- Get End of month
SET @DOut=DATEADD(hh,@h,@DOut) -- Remove hour
SET @DOut=DATEADD(mi,@m,@DOut) -- Remove minute

-- Return the result of the function
RETURN @DOut

END


ส่วนอีกอย่างใช้วิีธีการ Convert ให้ function ทำการ ตัด String ในส่วน เวลาออกไป
ตัวอย่างคือ

DECLARE @DateOut smalldatetime

SET @DateOut=DATEADD(day,-1, -- get end of input month by dateadd function
-- convert 1st day of next month from text to smalldatetime
CONVERT(smalldatetime,
-- 1st day of next month in text format dd/mm/yyyy
'01/' +
CONVERT(varchar(2),MONTH(DATEADD(month,1,@Datein)))+ '/' +
CONVERT(varchar(4),YEAR(DATEADD(month,1,@Datein))),103)
)


แล้วแต่ชอบครับ แบบไหนก็ได้

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

ปัญหาเด็ก กลืน ดินน้ำมัน

ปัญหา Custom Paper Size บน Crystal Report

Function Baht Text บน Crystal Report