透過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'); -- 三月
而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);
日期出來了,就可以套上 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);
參考資料
List the Name of the Months Between Date Ranges
透過common table expressions (CTE)來產生某區間的連續序號
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^