2014-01-31 2 views
0

이것은 캘린더를 만들 때 사용하는 구문입니다. 내가 가진 문제는 Week1의 시작일이 2012 년 이래로 시작일이 null로 표시된다는 것입니다. 다른 해에도 시작일 (또는 다른 경우 종료일)을 채우는 방법이 있습니까? @Winds of Change --- 이전에 null 인 시작 날짜와 종료 날짜를 추가합니다. 하지만 내가 쫓고있는 것은 예를 들어, 토요일을 실행하려면 내 기간이 필요합니다. 그럼 2013 년 53 주를 가져 가자. 날짜 범위는 12/28/2013 - 01/01/14이어야합니다. 캘린더가 그 형식으로 표시되도록 조정할 수있는 방법이 있습니까?날짜가 작년에 시작될 때 캘린더가 null로 표시됩니다.

CREATE TABLE dbo.Calendar (
    CalendarYear INT NOT NULL, 
    CalendarWeek INT NOT NULL, 
    WeekStartDate VARCHAR(50), 
    WeekEndDate VARCHAR(50), 
    CONSTRAINT PK_Calendar PRIMARY KEY (
     CalendarYear, 
     CalendarWeek 
     ) 
    ) 

SET DATEFIRST 6 

DECLARE @StartDate DATETIME, 
    @NumOfDays INT 

SET @StartDate = '20130101' 
SET @NumOfDays = 1000; 

WITH calendar 
AS (
    SELECT TOP (@NumOfDays) dateadd(day, row_number() OVER (
       ORDER BY sc1.column_id 
       ) - 1, @StartDate) AS CalendarDate 
    FROM sys.columns sc1 
    CROSS JOIN sys.columns sc2 
    ) 
INSERT INTO dbo.Calendar (
    CalendarYear, 
    CalendarWeek, 
    WeekStartDate, 
    WeekEndDate 
    ) 
SELECT DATEPART(year, c.CalendarDate) AS Year, 
    convert(VARCHAR(100), DATEPART(week, c.CalendarDate)) AS Week, --DATEPART(week, c.CalendarDate) AS Week,  
    MAX(CASE DATEPART(WEEKDAY, c.CalendarDate) 
      WHEN 1 
       THEN convert(VARCHAR(50), c.CalendarDate, 101) 
      ELSE NULL 
      END) AS StartDate, 
    MAX(CASE DATEPART(WEEKDAY, c.CalendarDate) 
      WHEN 7 
       THEN convert(VARCHAR(50), c.CalendarDate, 101) 
      ELSE NULL 
      END) AS EndDate 
FROM calendar c 
GROUP BY DATEPART(year, c.CalendarDate), 
    DATEPART(Week, c.CalendarDate) 
ORDER BY Year, 
    startdate, 
    convert(VARCHAR(100), DATEPART(week, c.CalendarDate)) --Week 

SELECT * 
FROM dbo.Calendar 

답변

1

그래서 문제가 당신이 일주일에 올해 그룹화하고 있다는이지만, 올해의 시작/끝에서, 올해는/시작하는 다른 주에 끝납니다. 따라서 첫 주가 수요일에 시작하면 그 해의 3 일간의 주뿐입니다.

나는 작은 팅커를 가지고 있었고, 일을 시작하여 그 시작/끝 날짜로 일/월 말을 표시합니다. 수정 된 버전은 다음과 같습니다.

SELECT 
    DATEPART(year, c.CalendarDate) AS Year, 
    convert(VARCHAR(100), DATEPART(week, c.CalendarDate)) AS Week, --DATEPART(week, c.CalendarDate) AS Week,  
    convert(VARCHAR(50), MIN(c.CalendarDate), 101) AS StartDate, 
    convert(VARCHAR(50), MAX(c.CalendarDate), 101) AS EndDate 
FROM 
    calendar c 
GROUP BY 
    DATEPART(year, c.CalendarDate), 
    DATEPART(Week, c.CalendarDate) 
ORDER BY 
    Year, 
    startdate, 
    convert(VARCHAR(100), DATEPART(week, c.CalendarDate)) --Week 

희망이 있습니다.

편집 : 댓글/편집에 대한 응답으로이 업데이트 문을 살펴보십시오. 삽입 후 삽입하십시오.

EDIT2 : 위의 삽입물과 업데이트는 사용하지 마십시오.

update dbo.Calendar set WeekStartDate = convert(VARCHAR(50), dateadd(day, 1, dateadd(week, -1, cast(WeekEndDate as datetime))), 101) 
where WeekStartdate is null 

update dbo.Calendar set WeekEndDate = convert(VARCHAR(50), dateadd(day, -1, dateadd(week, 1, WeekStartDate)), 101) 
where WeekEndDate is null 
+0

이전에 null 인 시작 날짜와 종료 날짜가 추가됩니다. 하지만 내가 쫓고있는 것은 예를 들어, 토요일을 실행하려면 내 기간이 필요합니다. 그럼 2013 년 53 주를 가져 가자. 날짜 범위는 12/28/2013 - 01/01/14이어야합니다. 캘린더가 그 형식으로 표시되도록 조정할 수있는 방법이 있습니까? (원본 게시물은 동일하게 수정 됨) – MasterOfStupidQuestions

+0

최근 변경 사항이 도움이되는지 확인하십시오. –

+0

이것은 내가 2014년 1월 1일 \t 2014년 1월 3일 2013년 12월 28일 \t 12/31/2013 2014 I이 결합 수 있었 을까 얻을 출력이든 쇼입니다 2013 년 12 월 28 일 - 2013 년 1 월 3 일 또는 1 주일 후 실행 2012 년 12 월 28 일 - 2014 년 1 월 3 일? – MasterOfStupidQuestions

관련 문제