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)
)
แล้วแต่ชอบครับ แบบไหนก็ได้
คือ 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)
)
แล้วแต่ชอบครับ แบบไหนก็ได้
ความคิดเห็น
แสดงความคิดเห็น