문제

나는 주말의 목록과 그 특정 주 월요일 날짜를 제공하는 SQL 쿼리를 찾고 있습니다.

예를 들어:

WeekNumber  DateMonday
39          2013-09-23
40          2013-09-30
...         ...

다음 Justs는 일주일을 생산합니다

select
     (DATEPART(ISO_WEEK,(CAST(getdate() as DATETIME)))) as WeekNumber,
     DATEADD(wk, DATEDIFF(d, 0, CAST(getdate() as DATETIME)) / 7, 0) AS DateMonday
도움이 되었습니까?

해결책

숫자 테이블이없는 경우 시스템 테이블을 사용하여 즉시 순차 숫자 목록을 생성 할 수 있습니다.

예를 들어

SELECT  Number = ROW_NUMBER() OVER(ORDER BY object_id)
FROM    sys.all_objects;

더 많은 숫자를 위해이 연장이 필요하면 테이블을 교차 할 수 있습니다.

SELECT  Number = ROW_NUMBER() OVER(ORDER BY a.object_id)
FROM    sys.all_objects a
        CROSS JOIN sys.all_objects b;

그런 다음 시작 날짜 부터이 주를 추가/빼기 만하면됩니다.

DECLARE @Monday DATE = DATEADD(WEEK, DATEDIFF(WEEK, 0, GETDATE()), 0);

WITH Numbers AS
(   SELECT  Number = ROW_NUMBER() OVER(ORDER BY object_id)
    FROM    sys.all_objects
)
SELECT  WeekNumber = DATEPART(ISO_WEEK, w.DateMonday),
        w.DateMonday
FROM    (   SELECT  DateMonday = DATEADD(WEEK, - n.Number, @Monday)
            FROM    Numbers n
        ) w;

이것은 단계별 명확성을 위해이 작업을 수행하는 장점입니다.

SELECT  WeekNumber = DATEPART(ISO_WEEK, w.DateMonday),
        w.DateMonday
FROM    (   SELECT  DateMonday = DATEADD(WEEK, DATEDIFF(WEEK, 0, GETDATE()) - ROW_NUMBER() OVER(ORDER BY object_id), 0)
            FROM    sys.all_objects
        ) w;

SQL 바이올린의 예

아론 버트 랜드 순차적 인 숫자 목록을 생성하는 몇 가지 깊이 비교 방법을 수행했습니다.

물론 가장 쉬운 방법은 캘린더 테이블

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