[SQL] 흉부외과 또는 일반외과 의사 목록 출력하기

Ray·2025년 3월 1일

SQL

목록 보기
3/39

🔎 문제설명

  • 출처: 프로그래머스
  • 사용언어(RDBMS): SQL(MySQL)
  • 문제:

    DOCTOR 테이블에서 진료과가 흉부외과(CS)이거나 일반외과(GS)인 의사의 이름, 의사ID, 진료과, 고용일자를 조회하는 SQL문을 작성해주세요. 이때 결과는 고용일자를 기준으로 내림차순 정렬하고, 고용일자가 같다면 이름을 기준으로 오름차순 정렬해주세요.



✅ 제출답안

# DOCTOR 테이블에서 진료과가 흉부외과(CS)이거나 일반외과(GS)인 의사의 이름, 의사ID, 진료과, 고용일자를 조회하는 SQL문을 작성해주세요. 
# 이때 결과는 고용일자를 기준으로 내림차순 정렬하고, 고용일자가 같다면 이름을 기준으로 오름차순 정렬해주세요.
SELECT DR_NAME, 
	   DR_ID, 
       MCDP_CD, 
       DATE_FORMAT(HIRE_YMD, '%Y-%m-%d') AS HIRE_YMD
FROM DOCTOR
WHERE (MCDP_CD = 'CS') OR (MCDP_CD = 'GS')
ORDER BY HIRE_YMD DESC, DR_NAME ASC;


🚀 풀이기록

처음에는 문제를 제대로 읽지 않아서 답이 틀렸다. 예제 답안처럼 YYYY-MM-DD형식으로 시간이 제외하고 나오게 해야하는데, 그 부분을 제대로 읽지 않았다. 그래서 WHERE문과 ORDER BY문에서 오답의 이유를 찾으려고 했다.

날짜 데이터를 원하는 형식으로 추출하려면 DATE_FORMAT() 함수를 사용하여, 첫번째 인자로는 변환할 컬럼과 두번째 인자에는 변환형식을 넣어주어야 한다는 걸 알았다.

( + %Y-%m-%d 에서 Y가 대문자인 이유는 년도가 4자리여야 하기 때문이다. 소문자로 바뀌면 2자리가 된다. m, d역시 대문자로 바꾸면 출력형식이 달라진다. M,D로하면 문자로 월,일이 문자로 출력된다.)

참고로,CAST()CONVERT() 로도 YYYY-MM-DD 형식으로 표현 가능하다. 다만 아래와 같이 코드를 작성해준 경우는 컬럼의 타입이 문자형이다.

# CAST 사용
SELECT DR_NAME, DR_ID, MCDP_CD, 
       CAST(HIRE_YMD AS CHAR(10)) AS HIRE_YMD
# CONVERT 사용
SELECT DR_NAME, DR_ID, MCDP_CD,
       CONVERT(HIRE_YMD, CHAR) AS HIRE_YMD

참고로 CAST()는 ANSI SQL 표준이며 MySQL에서도 지원되고, CONVERT()는 MySQL에서 지원되지만 ANSI SQL 표준은 아니다. 두 함수 모두 MySQL에서 사용 가능하지만, 완전한 ANSI SQL 호환성을 위해서는 CAST()를 사용하는 것이 좋다고 한다.

그리고 어떤 함수를 사용해서 변환했던, 기존에 DATE타입이었던 컬럼은 모두 문자형(CHAR)으로 변환된다.

profile
미래의 독자인 나를 위해 글을 씁니다.

0개의 댓글