Doctor Pepper

[프로그래머스] 3월에 태어난 여성 회원 목록 출력하기 본문

프로그래밍/SQL

[프로그래머스] 3월에 태어난 여성 회원 목록 출력하기

Doctor Pepper 2024. 10. 17. 10:49

 

1. 문제 설명

다음은 식당 리뷰 사이트의 회원 정보를 담은 MEMBER_PROFILE 테이블입니다. MEMBER_PROFILE 테이블은 다음과 같으며 MEMBER_ID, MEMBER_NAME, TLNO, GENDER, DATE_OF_BIRTH는 회원 ID, 회원 이름, 회원 연락처, 성별, 생년월일을 의미합니다.

Column name Type Nullable
MEMBER_ID VARCHAR(100) FALSE
MEMBER_NAME VARCHAR(50) FALSE
TLNO VARCHAR(50) TRUE
GENDER VARCHAR(1) TRUE
DATE_OF_BIRTH DATE TRUE

 

 

2. 문제

MEMBER_PROFILE 테이블에서 생일이 3월인 여성 회원의 ID, 이름, 성별, 생년월일을 조회하는 SQL문을 작성해주세요. 이때 전화번호가 NULL인 경우는 출력대상에서 제외시켜 주시고, 결과는 회원ID를 기준으로 오름차순 정렬해주세요.

 

3. 예시

MEMBER_PROFILE 테이블이 다음과 같을 때

MEMBER_ID MEMBER_NAME TLNO GENDER DATE_OF_BIRTH
jiho92@naver.com 이지호 01076432111 W 1992-02-12
jiyoon22@hotmail.com 김지윤 01032324117 W 1992-02-22
jihoon93@hanmail.net 김지훈 01023258688 M 1993-02-23
seoyeons@naver.com 박서연 01076482209 W 1993-03-16
yoonsy94@gmail.com 윤서연 NULL W 1994-03-19

 

SQL을 실행하면 다음과 같이 출력되어야 합니다.

MEMBER_ID MEMBER_NAME GENDER DATE_OF_BIRTH
seoyeons@naver.com 박서연 W 1993-03-16

 

4. 정답

SELECT MEMBER_ID, MEMBER_NAME, GENDER, DATE_OF_BIRTH
FROM MEMBER_PROFILE
WHERE GENDER = 'W'
AND DATE_FORMAT(DATE_OF_BIRTH, '%m') = '03'
AND TLNO IS NOT NULL
ORDER BY MEMBER_ID ASC;

 

- SQL 작성 단계

  • WHERE GENDER = 'W' : 성별이 여성('W')인 회원을 필터링한다.
  • DATA_FORMAT(DATE_OF_BIRTH, '%m') = '03' : 생년월일의 월 부분이 '03'인 회월을 필터링한다.
  • TLNO IS NOT NULL : 전화번호가 NULL이 아닌 회원만 조회한다.
  • ORDER BY MEMBER_ID ASC : 회원 ID를 기준으로 오름차순으로 정렬

 

5. 설명(DATE_FORMAT)

- DATE_FORMAT

 SQL에서 날짜 형식을 원하는 형태로 변환할 때 사용되는 함수이다. 이 함수는 날짜 데이터를 특정 형식으로 출력할 수 있도록 도와준다. 즉, 날짜 또는 시간 값에서 특정 부분(연도, 월, 일, 시간 등)을 추출하거나 표시할 때 사용된다.

DATE_FORMAT(date, format)
  • date : 변환할 날짜 또는 시간 값이다.
  • format : 날짜 또는 시간의 출력 형식을 지정하는 문자열이다. 여기서 사용하는 포맷 코드가 날짜 또는 시간의 각 부분을 정의한다.

- 주요 포맷 코드

  • %Y : 4자리 연도(ex. 2024)
  • %y : 2자리 연도(ex. 24)
  • %m : 2자리 월(01~12)
  • %d : 2자리 일(01 ~ 31)
  • %H : 24시간 형식의 시간(00 ~ 23)
  • %i : 2자리 분(00 ~ 59)
  • %s : 2자리 초(00 ~ 59)
  • %W : 요일명 (ex. Sunday)
  • %M : 월명(ex. January)

- 예시

SELECT DATE_FORMAT('2024-10-17', '%Y-%m-%d') AS formatted_date;
  • 결과 : 2024-10-17
SELECT DATE_FORMAT('2024-10-17', '%M %d, %Y') AS formatted_date;
  • 결과 : October 17, 2024
SELECT DATE_FORMAT('2024-10-17 14:30:45', '%H:%i:%s') AS time_only;
  • 결과 : 14:30:45

 

- 응용 1 : 회원 생일을 'YYYY년 MM월 DD일' 형식으로 표시

SELECT MEMBER_ID, MEMBER_NAME, DATE_FORMAT(DATE_OF_BIRTH, '%Y년 %m월 %d일') AS birthdate
FROM MEMBER_PROFILE;

 

- 응용 2 : 특정 연도의 생일을 가진 회원 조회

SELECT MEMBER_ID, MEMBER_NAME, DATE_OF_BIRTH
FROM MEMBER_PROFILE
WHERE DATE_FORMAT(DATE_OF_BIRTH, '%Y') = '1992';

 

- 응용 3 : 생일이 오늘인 회원 조회

SELECT MEMBER_ID, MEMBER_NAME, DATE_OF_BIRTH
FROM MEMBER_PROFILE
WHERE DATE_FORMAT(DATE_OF_BIRTH, '%m-%d') = DATE_FORMAT(NOW(), '%m-%d');
  • NOW() 함수는 현재 날짜와 시간을 반환하며, DATE_FORMAT을 이용해 월과 일만 추출하여 비교한다.

- 응용 4 : 나이 계산 후 회원 정보 표시

SELECT MEMBER_ID, MEMBER_NAME, DATE_OF_BIRTH,
             YEAR(NOW()) - YEAR(DATE_OF_BIRTH) - (DATE_FORMAT(NOW(), '%m%d')
                                               < DATE_FORMATE(DATE_OF_BIRTH, '%m%d')) AS age
FROM MEMBER_PROFILE;
  • 현재 연도에서 생년월일의 연도를 빼서 나이를 계산한다. 또한, 현재 날짜가 생일을 지났는지 여부를 고려하여 정확한 나이를 계산한다.

- 응용 5 : 생일이 이번 주에 있는 회원 조회

SELECT MEMBER_ID, MEMBER_NAME, DATE_OF_BIRTH
FROM MEMBER_PROFILE
WHERE WEEKOFYEAR(DATE_OF_BIRTH) = WEEKOFYEAR(NOW());
  • WEEKYEAR() 함수와 DATE_FORMAT을 활용하여 이번 주에 생일이 있는 회원을 조회한다.
  • WEEKYEAR() 함수는 날짜 값이 속한 연도의 몇 번째 주인지를 반환하는 함수이다.

- 응용 6 : 생일이 지난 회원 조회

SELECT MEMBER_ID, MEMBER_NAME, DATE_OF_BIRTH
FROM MEMBER_PROFILE
WHERE DATE_OF_BIRTH < CURDATE();
  • CURDATE()는 현재 날짜를 반환하며, DATE_OF_BIRTH와 비교하여 생일이 이미 지난 회원을 찾는다.