본문 바로가기
Database

[Mysql] 두 날짜 사이의 날짜 목록 및 데이터 구하는 방법

by GoodDayDeveloper 2020. 10. 27.
반응형

안녕하세요. 오늘은 mysql에서 원하는 기간안에의 날짜 목록과 데이터를 구하는 방법에 대해 이야기해보려합니다.

일반적으로 데이터를 뽑게되면 데이터만 있는 날짜만 나오게됩니다.

예를 들어

1020일부터 1026일까지가 원하는 기간이고

1022일에만 데이터가 있는 상태에서 데이터를 뽑으면

아래와 같이 1022일만 날짜가 나오고 나머지 날짜는 나오지 않게됩니다.

 

 

 

이를 해결하기 위해서는 3가지가 필요합니다.

 

  1. 날짜 추출 쿼리
  2. 데이터 추출 쿼리
  3. Left outer join

 


 

1. 날짜 추출 쿼리

우선 날짜 추출 쿼리입니다.

Curdate()를 사용하여 현재일 기준으로 일주일 전의 데이터를 추출합니다.

 

 

1
2
select curdate() - INTERVAL (a.a) DAY as Date
    from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6) as a
cs

 

2.데이터 추출 쿼리

이젠 원하는 데이터를 추출할 쿼리를 만들어 줍니다.

 

1
2
3
4
5
6
7
8
SELECT 
  MID(cs_regdate, 1,10) as Month
  ,count(case when  cs_type ='1'  then 1 end) as count
  ,count(case when  cs_type ='2'  then 1 end) as count2
FROM 
    테이블명
group by
   Month 
cs

 

3. Left outer join

그리고 날짜 쿼리를 기준으로 데이터 쿼리를 left outer join 합니다.

날짜 쿼리는 x, 데이터 쿼리 y로 지정한 다음 y쿼리의 날짜컬럼을 조인하게 됩니다.

그러면 데이터 없는 항목은 null이 나오게 됩니다. 이를 처리하기 위해서

가장 상단의 select문 밑에 ifnull이라면 0이 나오게끔 합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
select 
   x.ok as 별칭
  ,ifnull(y.count,0) as 별칭
  ,ifnull(y.count2,0) as 별칭
 from (
    select 
    a.Date as ok     
    from (
        select curdate() - INTERVAL (a.a) DAY as Date
        from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6) as a
    ) a 
) x left outer join 
(SELECT 
        MID(컬럼명, 1,10) as Month
      ,count(case when  조건  then 1 end) as 별칭
        ,count(case when  조건  then 1 end) as 별칭
    FROM 
          테이블명
    group by
         Month 
) y on x.ok= y.Month order by x.ok;
cs

 

 

 

 

 

 

반응형

댓글