你可以使用:
DECLARE @d DATE = GETDATE();
SELECT sub.prev_date
FROM (SELECT @d, MONTH(DATEADD(MM, -1, @d))) AS s(d,m)
CROSS APPLY (
SELECT DATEADD(D, c-1, DATEADD(MM, -1, DATEADD(DD, 1 - DAY(d),d))) AS prev_date
FROM (
VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),
(11),(12),(13),(14),(15),(16),(17),(18),(19),(20),
(21),(22),(23),(24),(25),(26),(27),(28),(29),(30),(31))AS x(c)
) AS sub
WHERE MONTH(sub.prev_date) = s.m
AND DATENAME(dw,sub.prev_date) IN ('Monday','Tuesday');
LiveDemo
输出:
╔════════════╗
║ prev_date ║
╠════════════╣
║ 2016-03-01 ║
║ 2016-03-07 ║
║ 2016-03-08 ║
║ 2016-03-14 ║
║ 2016-03-15 ║
║ 2016-03-21 ║
║ 2016-03-22 ║
║ 2016-03-28 ║
║ 2016-03-29 ║
╚════════════╝
警告:
SQL Server 语言应该是 English 否则 DATENAME 将不匹配。
您也可以与DATEPART weekday 进行比较,但您需要了解SET DATEFIRST 的设置。
编辑:
短一点:
DECLARE @d DATE = '2015-01-01';
SELECT sub.prev_date
FROM (SELECT DATEADD(DD, c - DAY(@d),DATEADD(MM, -1, @d)) AS prev_date
FROM (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),
(11),(12),(13),(14),(15),(16),(17),(18),(19),(20),
(21),(22),(23),(24),(25),(26),(27),(28),(29),(30),(31))AS x(c)) AS sub
WHERE MONTH(sub.prev_date) = MONTH(DATEADD(MM, -1, @d))
AND DATENAME(dw,sub.prev_date) IN ('Monday','Tuesday');
LiveDemo