2016-07-01 2 views
1

년과 월을 포함하는 변수, 즉 2016-07을 mysql에 전달하여 요일의 날짜 범위를 표시하고 싶습니다. 어떻게 할 수 있습니까? 예 : 2016을 전달하면 다음 내 출력은 다음과 같아야 -07 :mysql을 사용하는 특정 달의 주 범위

2016-07-03 to 2016-07-10 || 2016-07-11 to 2016-07-17 

하고 그렇게

+0

첫 번째 날짜를 07의 첫 번째 일요일로하고 마지막 날짜를 07의 마지막 일요일로 지정 하시겠습니까? –

+0

아니요. 예. 예를 들어서도 분명히 말하지 않습니다. 내가 5 월을 원한다면 그 달과 1 주일의 범위는 다음과 같습니다 : 2016-05-01 to 2016-05-07 || 2016-05-08부터 2016-05-14까지 || 2016-05-15 to 2016-05-21 || 2016-05-22 ~ 2016-05-28 || 2016-05-29 ~ 2016-06-04 –

+0

2016-07을 통과하면 첫 번째 날짜를 결정하는 규칙은 2016-07-03입니까? 마지막 날짜의 규칙은 무엇입니까? –

답변

0

당신이 MySQL의에서이를 해결하기 위해 갈 때이 문제를 해결하는 여러 부분이 있습니다에.

주중에 일요일 또는 월요일에 시작할지 여부를 결정하는 것이 하나 있습니다. 이것은 로캘 별 비즈니스 규칙입니다. 이전에 대영 제국 (미국, 인도)에 속했던 지역에서는 보통 일요일입니다. 다른 곳에서는 월요일입니다.

그러면 다음과 같은 함수가 필요합니다. firstDayOfWeek(date). 그 순간에 대해 자세히 알아보십시오.

Google에 알려 주시면 해당 월의 마지막 날을 확인할 수있는 방법이 필요합니다. 그건 쉽지. 그것은 a이다 built-in MySQL function. LAST_DAY(date)

당신은 1941-12와 같은 끈으로 문제의 달을 지정할 것이라고 말했다. 이를 DATE 개체로 변환해야합니다. 즉 다음과 같이 수행 할 수 있습니다

STR_TO_DATE(CONCAT(`1941-12`, `-01'), '%Y-%m-%d') 

우리의 그 테이블 seq_0_to_4을 부르 자 4. 0에서 정수와 가상 테이블이 필요합니다. 달의 일요일 (또는 월요일)이 5 개를 초과하지 않기 때문에 정수 범위를 선택합니다. 나중에 그 이상.

오케이, 개념적 빌딩 블록입니다. 그들을 사용합시다.

월의 마지막 날에서 유래 주일의 첫날은

SET @month := '1941-12'; 
SET @first_day_of_month := STR_TO_DATE(CONCAT(`1941-12`, `-01'), '%Y-%m-%d') 
SET @seed : =FirstDayOfWeek(LAST_DAY(first_day_of_month)); 

는 그런 다음 @seed되는 마지막 그 중 4 ~ 5 주 연속-부터 일을해야 할 것입니다.

 SELECT @seed - INTERVAL (7*seq.seq) first_day_of_week 
      FROM seq_0_to_4 

다음으로 그 달의 일수로 제한해야합니다.

SELECT first_day_of_week, 
     first_day_of_week + INTERVAL 6 DAY last_day_of_week 
    FROM (
     SELECT @seed - INTERVAL (7*seq.seq) first_day_of_week 
      FROM seq_0_to_4 
     ) w 
WHERE first_day_of_week >= @first_day_of_month 
ORDER BY first_day_of_week 

이렇게하면 월로 시작하는 매주 한 행씩 표시됩니다. 마지막 평일은 다음 달에있는 주를 제외 할 경우, 변경하려면 WHERE에

마지막으로
WHERE first_day_of_week >= @first_day_of_month 
    AND first_day_of_week + INTERVAL 6 DAY <= @seed 

, 당신은 귀하의 질문에 지정된 정확한 문자열 형식을 얻기 위해,이에 해당 쿼리를 포장 :

SELECT GROUP_CONCAT (
      CONCAT(first_day_of_week, ' to ', last_day_of_week) 
      SEPARATOR ' || ' 
      ORDER BY first_day_of_week) 
    FROM (
     SELECT first_day_of_week, 
       first_day_of_week + INTERVAL 6 DAY last_day_of_week 
      FROM (
       SELECT @seed - INTERVAL (7*seq.seq) first_day_of_week 
        FROM seq_0_to_4 
       ) w 
     WHERE first_day_of_week >= @first_day_of_month 
     ) x 

그게 전부입니다.

FirstDayOfWeek(dt)을 약속했습니다. 여기있어.

 FROM_DAYS(TO_DAYS(dt) -MOD(TO_DAYS(dt) -1, 7)) 

약간의 마법 주문이지만 작동합니다. 일주일에 월요일이 시작된다면이게 그거야.

 FROM_DAYS(TO_DAYS(dt) -MOD(TO_DAYS(dt) -2, 7)) 

seq_0_to_4을 약속했다.MySQL의 MariaDB 포크를 사용하고 있다면, 내장되어 있습니다. Sun/Oracle 포크를 사용한다면 이것을 다음과 같이 정의하십시오.

(SELECT 0 AS seq UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) seq_0_to_4 

는 모두 함께 퍼팅 :

그것은 부당하게 복잡
SET @month := '1941-12'; 
SET @first_day_of_month := STR_TO_DATE(CONCAT(`1941-12`, `-01'), '%Y-%m-%d'); 
SET @seed := FROM_DAYS(TO_DAYS(LAST_DAY(first_day_of_month)) 
         -MOD(TO_DAYS(LAST_DAY(first_day_of_month)) -1, 7)); 
SELECT GROUP_CONCAT (
      CONCAT(first_day_of_week, ' to ', last_day_of_week) 
      SEPARATOR ' || ' 
      ORDER BY first_day_of_week) 
    FROM (
     SELECT first_day_of_week, 
       first_day_of_week + INTERVAL 6 DAY last_day_of_week 
      FROM (
       SELECT @seed - INTERVAL (7*seq.seq) first_day_of_week 
        FROM  (SELECT 0 AS seq UNION SELECT 1 UNION SELECT 2 
              UNION SELECT 3 UNION SELECT 4 
          ) seq 
       ) w 
     WHERE first_day_of_week >= @first_day_of_month 
     ) x 

이 (기술적 용어는 입니다 빌어 먹을 털은) 순수한 MySQL의-방언 SQL의 문제를 해결하기 위해,하지만이 가능합니다.

+0

SQL 데이터 산술의 가능성을 볼 수 있도록이 부분을 설명합니다. 나는 그것을 디버깅하지 않았다. 내 희망은 당신이 그것을 배우고 그것을 당신의 프로그램에 그대로 복사하는 것이 아니라 당신의 것입니다. –

관련 문제