我有一个日期范围,其开始日期是今天之前的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
答案 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调用中查看实际日期......