Sql 如何获得上个月的所有周一或周二

Sql 如何获得上个月的所有周一或周二,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,上个月的所有星期一或星期二我该如何安排?我没有看到任何关于它的例子 您可以使用: 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 F

上个月的所有星期一或星期二我该如何安排?我没有看到任何关于它的例子

您可以使用:

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');
输出:

╔════════════╗
║ 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语言应为英语,否则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');
您可以使用:

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');
输出:

╔════════════╗
║ 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语言应为英语,否则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');

这样做非常明智。非常感谢你!这样做非常明智。非常感谢你!关于cte的几个例子http://bradsruminations.blogspot.ru/search?updated-max=2011-10-04T12:57:00-07:00&max results=1逐步明确主题您的问题假定参考日期。因为现在世界上不同的地方有不同的日期,所以上个月对不同的人来说可能是不同的。GETDATE使用服务器的时区。这与今天有关吗?如果明天改变怎么办?cte的一些例子http://bradsruminations.blogspot.ru/search?updated-max=2011-10-04T12:57:00-07:00&max results=1逐步明确主题您的问题假定参考日期。因为现在世界上不同的地方有不同的日期,所以上个月对不同的人来说可能是不同的。GETDATE使用服务器的时区。这与今天有关吗?如果明天改变呢?谢谢你的解决方案。很好,谢谢你的解决方案。它很整洁。