2010-08-17 2 views
5

어떻게 계산 했습니까? 월요일은 MySQL을 사용하여 한 달 남았습니다 (오늘 계산).예 : 월요일에 남은 월요일

하나의 쿼리에서 모든 요일에 해결할 솔루션에 대한 보너스 포인트.

원하는 출력 (화 당당한 17 일에서 실행) :

http://www.gizmola.com/blog/archives/99-Finding-Next-Monday-using-MySQL-Dates.html

SELECT DATE_ADD(CURDATE(), INTERVAL (9 - IF(DAYOFWEEK(CURDATE())=1, 8, 
DAYOFWEEK(CURDATE()))) DAY) AS NEXTMONDAY; 

"다음주 월요일을 찾아"나는이 문서에 따라 뭔가

을 발견

dayOfWeek left 
1   2  -- Sunday 
2   2  -- Monday 
3   3  -- Tuesday (yep, including today) 
4   2  -- Wednesday 
5   2  -- Thursday 
6   2  -- Friday 
7   2  -- Saturday 

답변

1

에 포함 된 날짜 테이블을 만듭니다 매일 신경 쓰는 행 (2000 년 1 월 1 일부터 2099 년 12 월 31 일까지) :

create table dates (the_date date primary key); 

delimiter $$ 

create procedure populate_dates (p_start_date date, p_end_date date) 
begin 
declare v_date date; 
set v_date = p_start_date; 
while v_date <= p_end_date 
do 
    insert ignore into dates (the_date) values (v_date); 
    set v_Date = date_add(v_date, interval 1 day); 
end while; 
end $$ 

delimiter ; 

call populate_dates('2000-01-01','2099-12-31'); 

그런 다음 원하는 출력을 얻기 위해 다음과 같은 쿼리를 실행할 수 있습니다 월에 왼쪽 0 발생이 요일을 제외합니다

set @date = curdate(); 

select dayofweek(the_date) as dayOfWeek, count(*) as numLeft 
from dates 
where the_date >= @date 
and the_date < str_to_date(period_add(date_format(@date,'%Y%m'),1),'%Y%m') 
group by dayofweek(the_date); 

합니다. 당신이 사람들을보고 싶은 경우 요일에 다른 테이블 (1-7) 만들 수 있습니다

create table days_of_week (
    id tinyint unsigned not null primary key, 
    name char(10) not null 
); 

insert into days_of_week (id,name) values (1,'Sunday'),(2,'Monday'), 
    (3,'Tuesday'),(4,'Wednesday'),(5,'Thursday'),(6,'Friday'),(7,'Saturday'); 

을 그리고 왼쪽으로 해당 테이블을 조회하면 날짜 테이블에 조인

select w.id, count(d.the_Date) as numLeft 
from days_of_week w 
left outer join dates d on w.id = dayofweek(d.the_date) 
    and d.the_date >= @date 
    and d.the_date < str_to_date(period_add(date_format(@date,'%Y%m'),1),'%Y%m') 
group by w.id; 
1

우리가해야 할 일은 마지막 달과 ne 사이의 일을 계산하는 것입니다. xt Monday 그리고 7로 나누십시오.

업데이트 (현재 날짜 포함) :

그래서 결과는 같다 :

화요일 월요일

 SELECT CEIL(((DATEDIFF(LAST_DAY(NOW()),DATE_ADD(CURDATE(), 
INTERVAL (9 - IF(DAYOFWEEK(CURDATE())=1, 8, DAYOFWEEK(CURDATE()))) DAY)))+1)/7) 
    + IF(DAYOFWEEK(CURDATE())=2,1,0) 

을 위해 :

SELECT CEIL(((DATEDIFF(LAST_DAY(NOW()),DATE_ADD(CURDATE(), 
INTERVAL (10 - IF(DAYOFWEEK(CURDATE())=1, 8, DAYOFWEEK(CURDATE()))) DAY)))+1)/7) 
    + IF(DAYOFWEEK(CURDATE())=3,1,0) 
+0

다른 요일에도 적용하려면 심각한 수정이 필요하며 원하는 출력을 반환하는 버전을 만드는 것이 번거로울 수 있습니다. –

+0

그것의 오늘 포함되지 않습니다 당신은 +1로 나누기 전에 +1을 추가 할 필요가 있다고 생각합니다. –

+0

그리고 나는 이것을 하나의 쿼리에서 어떻게 수행 할 지 모릅니다. 아마도 함수에 넣고 호출 할 때 도움이 될 것입니다. 매개 변수에 '9' –

0

내 답변을보십시오.

MySQL: Using the dates in a between condition for the results

내가 멋지게 @ 워커의 위, 그러나 쿼리 내에서 DAYOFWEEK() 함수를 할 필요없이, 그리고 아마도 유사 일 것이라고 생각하는 방법에 대한

Select all months within given date span, including the ones with 0 values

더 유연합니다. 응답 중 하나가 내 테이블의 SQL 덤프에 대한 링크를 가지고 있는데 도움이된다면 가져올 수 있습니다!