2012-10-29 4 views
1

답변을 검색 한 결과 비슷한 질문에 온라인 답변을 얻었지만 내 용도로 사용할 수 없었습니다. 도움이 필요해.MySQL 쿼리에서 주어진 달의 N 번째 요일의 날짜를 얻으려면 어떻게해야합니까?

저는 반복 일정을 지원하는 캘린더를 만들고 있습니다. 나는 거의 끝났지 만 마지막 부분은 가장 힘듭니다. 모든 Y 개월 중 N 번째 X에서 발생하는 이벤트를 지원할 수 있어야합니다. 여기서 X는 주어진 요일이고 Y는 몇 개월입니다.

나는 이미 "매 Y 개월마다"(아래의 쿼리 세그먼트에서 두 번째 줄부터 마지막 ​​부분까지) 부분을 파악했습니다. 나는 단지 "N 번째 평일"을 얻을 필요가있다.

누군가가 작성한 PHP 스크립트가 멋지게 해결되었다는 것을 알았고 사용 계획을 세웠지 만 MySQL 쿼리에서 전체적으로 수행해야한다는 것을 깨달았습니다. db 레코드의 일부이므로 기본 쿼리 외부에서 사용할 수 없습니다. 여기

그래서 당신은 내가이 향하고있어 곳의 아이디어를 얻을 수있는 쿼리의 일부입니다 :

WHEN event_recurring_pattern_type = 'monthly' AND event_recurring_monthly_type = 'dayxofeveryxmonths' THEN 
    MOD(PERIOD_DIFF(CONCAT(event_date_year,event_date_month), CONCAT('$date_year','$date_month')), event_recurring_monthly_dayofeveryxmonths) = 0 
    AND event_recurring_monthly_dayx = '$date_day' 

WHEN event_recurring_pattern_type = 'monthly' AND event_recurring_monthly_type = 'thexweekdayofeveryxmonths' THEN 
    MOD(PERIOD_DIFF(CONCAT(event_date_year,event_date_month), CONCAT('$date_year','$date_month')), event_recurring_monthly_dayofeveryxmonths) = 0 
    AND '$date_timestamp' = {the date of the Nth weekday of $date_month} 

이 달력을 빌드로 (달력의 전류 출력 날짜가 비교해야 마지막 줄 하나 하루에 한 번씩) 출력 과정에서 우리가있는 달의 N 번째 평일의 날짜로 대체합니다. 이벤트가 일치하면 해당 이벤트가 캘린더에 출력됩니다.

$ date_timestamp는이 경우 'YYYY-MM-DD'형식의 현재 출력 날짜이므로, 날짜가 지정된 N 번째 요일도 해당 형식이어야합니다.

충분한 정보를 제공하지 못했거나 다른 곳에서 적절히 답변 한 적이 있다면 알려주십시오. 내 질문과 관련된 많은 정보를 제공했지만 여전히 내 문제를 해결할 수있는 완벽한 대답을 얻었음에도 불구하고 일부 사람들이 너무 모호하거나 정보가 충분하지 않다고 생각하여 내 이전 질문 중 하나가 "닫혔습니다." 부정적인 행동을 취하기 전에 필요한 경우 질문을 향상시킬 수있는 기회를주십시오.

미리 감사드립니다.

오 그래, 선택적으로 지정된 월의 지정된 요일을 얻으려면 추가로 만들 수 있다면 더 좋을 것입니다. PHP 스크립트는 그렇게했지만, 내가 말했듯이, 이번에는 PHP로 할 수 없다.

답변

0

가장 쉬운 방법은 필요한 정보로 새 테이블을 채우는 프로그램을 작성하는 것입니다. 장래에 먼 길을 가려면 커다란 테이블이 필요하지 않습니다. 그런 다음 쿼리의 테이블에 조인하십시오.

+0

나는 이것이 어떻게 도움이되는지, 심지어 어떻게 구현할지 모릅니다. 예를 들어 줄 수 있습니까? – vertigoelectric

1

사용 DAYOFWEEK() :

WHEN event_recurring_pattern_type = 'monthly' 
AND event_recurring_monthly_type = 'thexweekdayofeveryxmonths' 
THEN MOD(
     PERIOD_DIFF(
     CONCAT(event_date_year,event_date_month), 
     CONCAT('$date_year','$date_month') 
     ), event_recurring_monthly_dayofeveryxmonths 
    ) = 0 
AND DAYOFWEEK('$date_timestamp') = event_recurring_monthly_dayofweek 

는 위의 event_recurring_monthly_dayofweek 열의 또한 가정,하지만 당신은 그냥 쉽게 요일 정수를 저장하기 위해 event_recurring_monthly_dayx 열을 다시 사용할 수 있습니다. 나는 이것을 시도하기 위하여려고하고있다

+0

고마워,하지만이게 내가 묻는대로하지 않는다고 생각해. AND 이후의 평가와 같아서 특정 요일에 실제로 적용 할 것입니다. 그러나 매월 매주 그 날에 적용 할 것입니다. 나는 그것이 단지 N 번째 평일과 일치하기를 원한다. 예를 들어, 그 달의 "셋째 금요일"또는 "두 번째 화요일"등 – vertigoelectric

0

(아직 현장에서 입증되지) :

SET @target = DATE('2013-06-15'); 
SELECT 1 + ( 
IF(MONTH(DATE_SUB(@target, INTERVAL 7 DAY)) = MONTH(@target), 1, 0) + 
IF(MONTH(DATE_SUB(@target, INTERVAL 14 DAY)) = MONTH(@target), 1, 0) + 
IF(MONTH(DATE_SUB(@target, INTERVAL 21 DAY)) = MONTH(@target), 1, 0) + 
IF(MONTH(DATE_SUB(@target, INTERVAL 28 DAY)) = MONTH(@target), 1, 0)) AS nth_weekday_of_month; 

그것은 상대적으로 빠른 것 같다,하지만 당신은 항상 미리 채워진 테이블을 만들 수 있습니다 (몇 년 밖으로, 또는 생성 crons 등으로)이 기능을 사용합니다.

관련 문제