2012-04-13 2 views
1

에 의해 같은MySQL을보기/절차는 ... 개월

뭔가 년의 모든 주를 나열하려면 :

------------------------ 
| Year | Month | Week | 
| 2012 | 1 | 1 | 
| 2012 | 1 | 2 | 
| 2012 | 1 | 3 | 
| 2012 | 1 | 4 | 
| 2012 | 1 | 5 | 
| 2012 | 2 | 5 | 

등등 ...

는이 같은 뷰 (일부 지원 테이블을 사용)를 생성 할 수 있습니까?

+1

당신은 주를 시작 할 때 먼저 정의해야합니다. 월요일에는? 일요일에? 1 월 1 일과 같은 날에? –

답변

3

당신은 저장 프로 시저로 수행 할 수 있습니다

DELIMITER $$ 

CREATE PROCEDURE createDatesTable() 
BEGIN 

DECLARE FullDate date; 

DROP TABLE IF EXISTS dates; 
CREATE TABLE dates(
date_key date NOT NULL, 
calendarYear int NOT NULL, 
calendarQuarter tinyint NOT NULL, 
calendarMonthNo int NOT NULL, 
calendarWeekNo tinyint NOT NULL, 
dayNumberOfMonth tinyint NOT NULL, 
dayNumberOfWeek tinyint NOT NULL, 
PRIMARY KEY (date_key)); 

SET FullDate = '2012-01-01'; 

WHILE (FullDate <= '2012-12-31') DO 
BEGIN 

INSERT INTO dates( 
    date_key, 
    calendarYear, 
    calendarQuarter, 
    calendarMonthNo, 
    calendarWeekNo, 
    dayNumberOfMonth, 
    dayNumberOfWeek 
)VALUES( 
    FullDate, 
    YEAR(FullDate), 
    QUARTER(FullDate), 
    MONTH(FullDate), 
    WEEK(FullDate, 1), /*Have a look at the WEEK() function in the manual!!!*/ 
    DAYOFMONTH(FullDate), 
    DAYOFWEEK(FullDate) 
); 

SET FullDate = DATE_ADD(Fulldate, INTERVAL 1 DAY); 
END; 
END WHILE; 
END ; 
$$ 
DELIMITER ; 

는 그런 다음 call createDatesTable()

을하고 당신은 당신의 테이블을 채운 것입니다.

중요 : ypercube 님의 의견이 맞습니다. 이것을 고려해야합니다. 따라서 WEEK() function 및 지원되는 모드를 살펴보십시오. 그에 따라 절차를 조정하십시오.

+0

@Marcx 의견이 있으십니까? 네가 원하는게 아니야? – fancyPants

0

이 표의 확장으로 추가하십시오!
사람이 다음 코드는 그렇게 할 것입니다 매주의 날짜 범위 (첫 번째 날짜와 마지막 날짜) 얻는 방법을 찾고있는 경우 : 당신의 선택의 선택 년에

SELECT date_key AS first_date, MAX(date_key) AS last_date, calendarWeekNo AS week_no 
FROM dates WHERE calendarYear = 2013 
GROUP BY `calendarWeekNo` 
ORDER BY `calendarWeekNo` ASC 

을 그냥 변경을 ! 위의 예는 입니다.

결과 :

first_date | last_date | week_no 
--------------------------------- 
2013-01-01 | 2013-01-06 | 1 
2013-01-07 | 2013-01-13 | 2 
2013-01-14 | 2013-01-20 | 3 

etc, etc, etc...