Database/MySQL

[ mysql ] 1년 사이에 등록된 데이터 리스트 뽑기

솔헬레나 2022. 1. 6. 22:51

상황

- 2021년 1월 부터 2021년 12월 사이에 등록된 데이터 리스트를 뽑아야 한다.

- 저장된 데이터는 GMT 00:00 이고, 한국 시간으로 보여주어야 한다.

- 이벤트의 시작일과 종료일은 날짜만 있는 경우 날짜만 표시하고, 시간이 있는 데이터인 경우 시간까지 모두 표시해야한다.

 

 

찾아본 것 

🌈  조건 검색 ( case when then end )

체크해야할 조건이 많은 경우, 특정 조건에 부합할 때 특정한 값을 반환한다. 

더보기

- 양식

  case

     when 조건

     then 반환값

     when 조건

     then 반환값

  else  조건에 해당 안되는 경우 반환 값   end  

 

- when과 then은 무한대로 쓸수 있다.

- 프로그래밍 언어의 switch /case문과 비슷하지만 mysql에서는 하나의 조건에 부합하는 값만 반환한다.

- else가 있으면 모든 조건에 해당하지 않는 경우에 else가 반환된다. 

- else가 없고, case 조건에 부합하는 값이 없으면 null을 반환한다.

 

- 활용

case when column_name is null 
then event.start_datetime 
else DATE_FORMAT(event.start_date, '%Y-%m-%d') end 

 

 

🌈  null인 경우를 비교하기 ( is null )

더보기

null은 "="부호로 비교할 수 없다. 

is null을 사용하여 null인지 확인할 수 있다.

column_name is null  

 

만약 null이 아닌 경우를 설정한다면  is not 을 추가하면 된다, 

column_name is not null  

 

 

- 활용 

select * from tb_name

where

        column_name is null 

 

 

🌈  특정 기간으로 검색하기 ( between )

where column_name between  '2021-01-01' and '2021-12-31' 

 

 

🌈  날짜 바꾸기 : 타임존 적용 ( CONVERT_TZ ) 

더보기

세계 협정시는 그리치니 표준시(GMT) 와 협정세계시 (UTC)로 나뉜다. 하지만 둘다 동일한 시간이다.
시간대는 영국의 그리니치 천문대를 기준으로 시작하여 자오선에 따른 시간대를 선정한다.

- 영국시간 +00:00

- 한국시간 +09:00

 

CONVERT_TZ( 대상데이터, 현재시간대, 변경시간대)

 

CONVERT_TZ(NOW(),'+00:00','+09:00')

 

 

🌈  날짜를 특정 데이터 포맷으로 출력하기 ( DATE_FORMAT ) 

더보기

DATE_FORMAT(대상데이터, 포맷)

- 대상 데이터를 원하는 포맷으로 바꿀 수 있다.

- %Y 는 연 , %m 월, %d 일, %H.시 , %i 분, %s 초 ( https://lightblog.tistory.com/155

 

DATE_FORMAT(event.start_date, '%Y-%m-%d')

 

 

🌈  바꾼 날짜로 검색하기

더보기

where

DATE_FORMAT(scheduleList.endDate,'%Y') = '2021'

 

* 검색결과에서 검색하기

 

 

* 쿼리 플랜 보기 : EXPLAIN

 

 

 

결과 

select * 
from 
 ( select
	event.project_no 		as projectNo
	, (select p.project_name from tb_project p where p.project_no = event.project_no) as projectName		, event.event_no  			as scheduleNo
	, event.event_title 			as scheduleTitle
	, case when event.start_date is null 
		then convert_tz(event.start_datetime , '+00:00' , '+09:00')
		else DATE_FORMAT(event.start_date, '%Y-%m-%d') end as startDate
	, case when event.end_date is null 
		then convert_tz(event.end_datetime , '+00:00', '+09:00')
		else DATE_FORMAT(event.end_date, '%Y-%m-%d') end as endDate
	, event.reg_user_no				as regUserNo
	, (select userInfo.user_name from tb_user_info userInfo where userInfo.user_no = event.reg_user_no ) as regUserName
	, convert_tz(event.reg_date, '+00:00' , '+09:00') 	as regDate
  from tb_event event
  where 
	event.project_no = 30038399
  ) eventList
where
  DATE_FORMAT(eventList.startDate,'%Y') = '2021' 
  or DATE_FORMAT(eventList.endDate,'%Y') = '2021'	
order by startDate desc ;