년과 월을 포함하는 변수, 즉 2016-07을 mysql에 전달하여 요일의 날짜 범위를 표시하고 싶습니다. 어떻게 할 수 있습니까? 예 : 2016을 전달하면 다음 내 출력은 다음과 같아야 -07 :mysql을 사용하는 특정 달의 주 범위
2016-07-03 to 2016-07-10 || 2016-07-11 to 2016-07-17
하고 그렇게
년과 월을 포함하는 변수, 즉 2016-07을 mysql에 전달하여 요일의 날짜 범위를 표시하고 싶습니다. 어떻게 할 수 있습니까? 예 : 2016을 전달하면 다음 내 출력은 다음과 같아야 -07 :mysql을 사용하는 특정 달의 주 범위
2016-07-03 to 2016-07-10 || 2016-07-11 to 2016-07-17
하고 그렇게
당신이 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의 문제를 해결하기 위해,하지만이 가능합니다.
SQL 데이터 산술의 가능성을 볼 수 있도록이 부분을 설명합니다. 나는 그것을 디버깅하지 않았다. 내 희망은 당신이 그것을 배우고 그것을 당신의 프로그램에 그대로 복사하는 것이 아니라 당신의 것입니다. –
첫 번째 날짜를 07의 첫 번째 일요일로하고 마지막 날짜를 07의 마지막 일요일로 지정 하시겠습니까? –
아니요. 예. 예를 들어서도 분명히 말하지 않습니다. 내가 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 –
2016-07을 통과하면 첫 번째 날짜를 결정하는 규칙은 2016-07-03입니까? 마지막 날짜의 규칙은 무엇입니까? –