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)으로 변환된다.