如何利用 T-SQL 取得某一月份的最後一天?

本文將介紹如何利用 T-SQL 取得某一月份的最後一天。

情境描述

有網友在論壇上討論到想要利用 T-SQL 取得某一個日期的下一個月的最後一天,根據這個問題筆者想到下一節的方法來滿足需求。

實作步驟

若您使用的是 SQL Server 2012 就簡單多了,可以利用新的 EOMONTH 日期函數來輕鬆地解決這個問題,詳情可以參考筆者之前寫的這篇文章。若您使用的是 SQL Server 2012 以前的版本,可能得透過一些手腳才能取得某一個日期加上一個月之後該月份的最後一天,筆者以下列的指令碼來實作:

IF OBJECT_ID('dbo.EndOfMonth','FN') IS NOT NULL
    DROP FUNCTION [dbo].[EndOfMonth]
GO

	
CREATE FUNCTION [dbo].[EndOfMonth]
(
    @date datetime,
    @increment int
)
RETURNS datetime
AS
BEGIN

	
    RETURN  DATEADD(d,-1,CONVERT(datetime,LEFT(CONVERT(char(8)
            ,DATEADD(M,@increment + 1,@date),112),6) + '01'))

	
END

接著您就可以利用和 SQL Server 2012 新增的 EOMONTH 日期函數一樣的方式取得某一個月份的最後一天,例如下列的指令碼:

SELECT dbo.EndOfMonth(GETDATE(),-2)   --取得今天的前兩個月的最後一天
SELECT dbo.EndOfMonth(GETDATE(),-1)   --取得今天的前一個月的最後一天
SELECT dbo.EndOfMonth(GETDATE(),0)    --取得這個月的最後一天
SELECT dbo.EndOfMonth(GETDATE(),1)    --取得下個月的最後一天
SELECT dbo.EndOfMonth(GETDATE(),2)    --取得下下個月的最後一天
SELECT dbo.EndOfMonth('20130228',1)   --取得2013-02-28的下個月的最後一天
SELECT dbo.EndOfMonth('20130430',1)   --取得2013-04-30的下個月的最後一天

執行結果如下圖:

image

要達到上述目的的做法很多種,筆者在此只是提出其中一種可能的解法,使用時請依據實際狀況調整成適合您的寫法,若有更好的做法也歡迎提出來分享,謝謝。

參考資料

- EOMONTH (Transact-SQL)

- SQL Server 2012 的 T-SQL 新功能 - 日期/時間函數