문제

시작 날짜가 오늘 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 호출에서 실제 날짜를 모두 볼 수 있습니다 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top