문제
시작 날짜가 오늘 2 년 전 날짜 범위가 있습니다. 예 : '05/29/2007 '~ '05/29/2009'.
다음과 같은 목록을 얻을 수 있도록 날짜 범위를 위반하려면 어떻게해야합니까?
(시작 날짜는 주중의 시작이 일요일이기 때문에 "05/29/2007"이 아닌 "05/27/2007"으로 시작합니다. 그리고 마지막 종말에 대한 동일한 추론, 2009 년 5 월 30 일 토요일)
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
해결책
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
이것은 필요한 범위와 함께 행 세트를 생성합니다.
다른 팁
@@ 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
당신의 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 주 전 2 년 전 1 주일 등이 있습니다.
이제 Groupweek의 수학이 어떻게 작동하는지. 이것은 실제로 데이터가있는 날짜를 기준으로 한주의 첫날을 계산할 것입니다 ... 올해 5 월 25 일, 26 일, 27 일에 대한 데이터가 있다고 말합니다. 금주의 - 일요일은 1 일에 일주일에 시작됩니다. 그래서 : 그래서 : : 그래서 : : 그래서 : : 그래서 : : 그래서 : : 그래서 : :
5 월 25 일 ~ 2 일 (요일) = 5 월 23 일 (토요일) +1 = 5 월 24 일 (주일 일요일). 5 월 26-3 일 (요일) = 5 월 23 일 ... etc 5 월 27-4 일 (요일) = 5 월 23 일
따라서 해당 원래 날짜 필드를 포함하여 한 SQL 호출에서 실제 날짜를 모두 볼 수 있습니다 ...