給定一個日期,輸出該月份所有日期並按周次分組顯示(每周起始日為週日)。
DECLARE @i INT; -- 計數器
DECLARE @curWk INT; -- 指定日期所在年份的周數
DECLARE @fstWk INT; -- 該月 1 號所在年份的周數
DECLARE @fstDay NVARCHAR(10); -- 該月第一天
DECLARE @lstDay NVARCHAR(10); -- 該月最後一天
DECLARE @tmpDay SMALLDATETIME; -- 每周週日的日期
DECLARE @date SMALLDATETIME; -- 指定日期
DECLARE @tmpDay1 SMALLDATETIME; -- 每周週六的日期
SET @date = '2007-09-01';
-- 取得該月第一天字串
SELECT @fstDay = CAST(YEAR(@date) AS NVARCHAR(4)) + '-' +
CAST(MONTH(@date) AS NVARCHAR(2)) + '-1';
SET @fstDay = CONVERT(NVARCHAR(10), CAST(@fstDay AS SMALLDATETIME), 120);
-- 取得第一天所在周數
SET @fstWk = DATEPART(wk, @fstDay);
-- 取得該月最後一天
SET @lstDay = CONVERT(NVARCHAR(10), DATEADD(d, -1, DATEADD(m, 1, @fstDay)), 120);
SET @i = 0;
-- 找出屬於上個月同一周的日期(即本月第一周的起始點)
WHILE (@i < 8)
BEGIN
SET @tmpDay = DATEADD(dd, @i, @fstDay);
SET @curWk = DATEPART(wk, @tmpDay);
IF @curWk > @fstWk
BEGIN
PRINT @tmpDay; -- 找到本月第一個週日
BREAK;
END
SET @i = @i + 1;
END
-- 後續邏輯可依此擴展輸出每周日期範圍
DATEPART(wk, date):回傳日期所在年份的周數(1-53)。DATEADD(interval, number, date):日期加減運算。CONVERT(style, date):格式轉換,120 = yyyy-mm-dd hh:mi:ss(24h)。可進一步撰寫函數或預存程序,輸出完整月曆表格,應用於報表排程、排班系統等。