首页 > 解决方案 > 一年中几周的填充表跳过了 2021 年的第一周

问题描述

因此,我在一个过程中使用了以下代码片段,它为我填写了一个临时表,其中包含每年一周的第一天、周数和月份名称。但是,当我到达 2020 年的第 53 周时,它会跳到 2021 年的第 2 周。发生这种情况是因为 1 月的第一天在所谓的第 53 周(这是正确的),但它也应该与第一行创建另一行2021 年 1 月的一周(即使星期天在 2020 年也是如此)。

片段:

SET DATEFIRST 7

DECLARE @tblSundays TABLE (
    [year] INT
    ,[month] INT
    ,[week] INT
    ,[date] DATETIME
    )

DECLARE @DateFrom DATETIME = '2020-12-12'
    ,@DateTo DATETIME = '2021-06-06';

--select @DateFrom,@DateTo;
WITH CTE (dt)
AS (
    SELECT @DateFrom
    
    UNION ALL
    
    SELECT DATEADD(d, 1, dt)
    FROM CTE
    WHERE dt < @DateTo
    )
INSERT INTO @tblSundays
SELECT datepart(year, dt)
    ,datepart(month, dt)
    ,datepart(week, dt)
    ,dt
FROM CTE
WHERE datepart("dw", dt) = 1
OPTION (MAXRECURSION 1000)
;
select * from @tblSundays

有什么方法可以在此代码段中执行此操作,还是应该创建手动验证?

谢谢!

标签: sql-server

解决方案


我看不出你如何在同一个片段上拥有这两个条件,但你可以在那里添加第二个查询来完成你想要做的事情。

像这样的东西,也许:

SET datefirst 7 
DECLARE @tblSundays TABLE 
  ( 
     [year]  INT, 
     [month] INT, 
     [week]  INT, 
     [date]  DATETIME
  ) 
DECLARE @DateFrom DATETIME = '2020-12-12', 
        @DateTo   DATETIME = '2021-06-06'; 

--select @DateFrom,@DateTo; 

WITH cte (dt) 
     AS (SELECT @DateFrom 
         UNION ALL 
         SELECT Dateadd(d, 1, dt) 
         FROM   cte 
         WHERE  dt < @DateTo) 
INSERT INTO @tblSundays 
SELECT Datepart(year, dt), 
       Datepart(month, dt), 
       Datepart(week, dt), 
       dt
FROM   cte 
WHERE  Datepart("dw", dt) = 1 
OPTION (maxrecursion 1000); 

--second new query
WITH cte (dt) 
     AS (SELECT @DateFrom 
         UNION ALL 
         SELECT Dateadd(d, 1, dt) 
         FROM   cte 
         WHERE  dt < @DateTo) 
INSERT INTO @tblSundays 
SELECT Datepart(year, dt), 
       Datepart(month, dt), 
       Datepart(week, dt), 
       dt
FROM   cte 
WHERE  Datepart("dw", dt) <> 1 
       AND Datepart(day, dt) = 1 
       AND Datepart(week, dt) NOT IN (SELECT week 
                                      FROM   @tblSundays) 
OPTION (maxrecursion 1000); 

SELECT * 
FROM   @tblSundays 
ORDER  BY year, 
          month, 
          week

这样可以吗?


推荐阅读