[SQL]取得某段日期區間的月份名稱

透過CTE取得某段日期區間的月份名稱

今天看到「List the Name of the Months Between Date Ranges」蠻有趣的,除了用作者的方式,也可以使用CTE的方式(CTE流水號可參考「透過common table expressions (CTE)來產生某區間的連續序號」)。

SQL有提供取得日期名稱的 Function 為 DATENAME

要取得月份名稱,DATENAME 第一個參數就給 MONTH ,第二個參數就給一個日期,如下,


SELECT DATENAME(MONTH, '20140301'); -- 三月

image

 

而2個資料要產生區間的資料,則可以透過CTE來產生,如下產生 2014/03/01 到 2014/09/01 的月份資料(透過 DATEADD 來增加),


DECLARE @StartDate  DATETIME,
@EndDate DATETIME;
SELECT @StartDate = '20140301' -- 三月
,@EndDate   = '20140901'; -- 九月

--包含開始月份
;WITH MONTH_RANGES 
AS(
	SELECT @StartDate AS MONTH_DATE, DATEDIFF(MONTH, @StartDate, @EndDate) AS MONTH_COUNT
	UNION ALL
	SELECT DATEADD(MONTH, 1, MONTH_DATE), DATEDIFF(MONTH, MONTH_DATE, @EndDate)
	FROM MONTH_RANGES MR
	WHERE MR.MONTH_COUNT > 1
)
SELECT MONTH_DATE, MONTH_COUNT 
FROM MONTH_RANGES
OPTION (MAXRECURSION 0);

image

 

日期出來了,就可以套上 DATENAME ,就是我們要的 月份名稱了,如下,


DECLARE @StartDate  DATETIME,
@EndDate DATETIME;
SELECT @StartDate = '20140301' -- 三月
,@EndDate   = '20140901'; -- 九月
--包含開始月份
;WITH MONTH_RANGES2 
AS(
	SELECT @StartDate AS MONTH_DATE, DATEDIFF(MONTH, @StartDate, @EndDate) AS MONTH_COUNT
	UNION ALL
	SELECT DATEADD(MONTH, 1, MONTH_DATE), DATEDIFF(MONTH, MONTH_DATE, @EndDate)
	FROM MONTH_RANGES2 MR
	WHERE MR.MONTH_COUNT > 1
)
SELECT DATENAME(MONTH, MONTH_DATE) AS MonthName, MONTH_DATE 
FROM MONTH_RANGES2
OPTION (MAXRECURSION 0);
 

image

 

參考資料

List the Name of the Months Between Date Ranges

透過common table expressions (CTE)來產生某區間的連續序號

DATENAME

DATEADD

DATEDIFF

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^