代码之家  ›  专栏  ›  技术社区  ›  dance2die

按周分组日期范围

  •  4
  • dance2die  · 技术社区  · 15 年前

    我有一个日期范围,开始日期比今天早2年。 例如:'05/29/2007'~'05/29/2009'。

    我怎样才能打破上述日期范围,这样我会得到一个列表如下?

    (开始日期以“05/27/2007”开始,而不是“05/29/2007”,因为工作日的开始是星期日,而“05/27/2007”是“05/29/2007”的第一个星期日,而最后一个结束日期“05/30/2009”是星期六)

    StartDate   EndDate
    05/27/2007  06/02/2007
    06/03/2007  06/09/2007
    ...
    05/24/2009  05/30/2009
    

    [更新] 这是我最后的问题

    WITH hier(num, lvl) AS (
        SELECT  0, 1
            UNION ALL
        SELECT  100, 1
            UNION ALL 
        SELECT  num + 1, lvl + 1
        FROM    hier
        WHERE   lvl < 100
    )
    SELECT  num, lvl,
        DATEADD(dw, -DATEPART(dw, '2007-05-29'), '2007-05-29') + num  * 7,
        DATEADD(dw, -DATEPART(dw, '2007-05-29'), '2007-05-29') + (num + 1) * 7
    FROM    hier
    where   num <= 104  --; 52 weeks/year * 2
    ORDER BY num
    
    3 回复  |  直到 15 年前
        1
  •  4
  •   Quassnoi    15 年前
    WITH hier(num, lvl) AS (
            SELECT  0, 1
            UNION ALL
            SELECT  100, 1
            UNION ALL 
            SELECT  num + 1, lvl + 1
            FROM    hier
            WHERE   lvl < 100
            )
    SELECT  DATEADD(dw, -DATEPART(dw, '29.05.2007'), '29.05.2007') + num  * 7,
            DATEADD(dw, -DATEPART(dw, '29.05.2007'), '29.05.2007') + (num + 1) * 7
    FROM    hier
    WHERE   DATEADD(dw, -DATEPART(dw, '29.05.2007'), '29.05.2007') + num * 7 < '29.05.2009' 
    ORDER BY
            num
    

    这将生成包含所需范围的行集。

        2
  •  2
  •   Tom H zenazn    15 年前

    您需要确保@ @ DATEFILL正确发送,然后您可以简单地使用下面的代码。不过,还是要先了解最新情况,这样你才能完全理解它。

    SET DATEFIRST 1
    
    DECLARE @my_date DATETIME
    
    SET @my_date = '2007-05-29'
    
    SELECT
         DATEADD(dw, -DATEPART(dw, @my_date), @my_date) AS StartDate,
         DATEADD(dw, 6 - DATEPART(dw, @my_date), @my_date) AS EndDate
    
        3
  •  0
  •   DRapp    15 年前

    在你的sql语句中应该非常简单直接…我在处理日期和日期算术方面有很长的历史,所以我会处理如下问题:

    select 
          datepart( year, YourDateField ) as GroupYear,
          datepart( week, ( YourDateField - datepart( day, YourDateField ) +1 ) as GroupWeek,
          YourDateField,
          OtherFields
      from 
          YourTable
      where 
          whateverDateRange...
      group by 
         GroupYear,
         GroupWeek
    

    一年和一周的原因是如果你跨越了多年,那么在第一年的第2周之前,你会有两年中的第1周,等等。

    现在,数学是如何工作的…参加集体周。这实际上会根据你的数据作为基础的日期来计算一周的第一天…假设你有今年5月25日,26日,27日的数据…它们分别是一周的第2天、第3天和第4天——星期日从第一天开始。所以:

    5月25日-2日(星期日)=5月23日(星期六)+1=5月24日(星期日)。 5月26日-3日(星期几)=5月23日…等 5月27日-4日(星期几)=5月23日

    因此,通过包含原始的日期字段,您也可以在一个SQL调用中看到真正的日期…