系統開發需要這個邏輯,簡單紀錄一下:
思路: 透過遞迴取得一個月份的所有日期,再使用星期去篩選。
範例: 年份為2023,月份為11月,要取得周一、周四的日期。
DECLARE @Year INT = 2023; -- 年份。 2023年
DECLARE @Month INT = 11; -- 月份。 11月
WITH AllDays AS (
SELECT DATEFROMPARTS(@Year, @Month, 1) AS [Date]
UNION ALL
SELECT DATEADD(DAY, 1, [Date])
FROM AllDays
WHERE DATEADD(DAY, 1, [Date]) <= EOMONTH(DATEFROMPARTS(@Year, @Month, 1))
)
SELECT [Date]
FROM AllDays
WHERE DATEPART(WEEKDAY, [Date]) IN (2, 5) -- MSSQL的星期代號 => Sun: 1, Mon: 2, Tue: 3, Wed: 4, Thu: 5, Fri: 6, Sat: 7
ORDER BY [Date]
OPTION (MAXRECURSION 31); -- 一個月最多31天,限制遞迴次數31