4

我有一个日期范围,开始日期是今天之前的 2 年。例如)“2007 年 5 月 29 日”~“2009 年 5 月 29 日”。

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

(开始日期以“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
4

3 回答 3

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

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

于 2009-05-27T16:07:57.743 回答
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
于 2009-05-27T15:57:39.043 回答
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 调用中查看真实日期...

于 2009-05-27T16:09:46.273 回答