按周分组日期范围

时间:2009-05-27 15:47:38

标签: sql tsql datetime date-range

我有一个日期范围,其开始日期是今天之前的2年。 例如)'05 / 29/2007'〜'05/29/2009'。

如何突破上述日期范围,以便获得如下列表?

(开始日期以“05/27/2007”开始,而不是“05/29/2007”,因为工作日开始是星期日,'05 / 27/2007'是'05 / 29的第一天/ 2007'和最后一个EndDate,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 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

您需要确保正确发送@@ DATEFIRST,然后您只需使用以下代码即可。请阅读DATEFIRST,以便您完全理解它。

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

答案 2 :(得分:0)

在你的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周等等。

现在,数学如何运作......对于GroupWeek来说。这实际上将根据您的数据作为基础的日期计算一周的第一天...假设您有今年5月25日,26日,27日的数据......他们将分别是第2天,第3天和第4天本周 - 星期日从第1天开始。所以:

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

因此,通过还包括相关的原始日期字段,您可以在一个SQL调用中查看实际日期......