now is better than never

[Oracle] 날짜 데이터 년, 월, 일 추출하기 - TO_CHAR, REGEXP_SUBSTR 본문

SQL/프로젝트

[Oracle] 날짜 데이터 년, 월, 일 추출하기 - TO_CHAR, REGEXP_SUBSTR

김초송 2022. 11. 30. 17:23

생년월일 데이터로 같은 생일인 사람이 있는지 알고 싶은데 오라클에 년, 월, 일 추출 함수가 없나...?

찾아보니 EXTRACT 라는 함수가 있긴 한데 

select birthday, count(*)
from (select empno
            , extract(month from birth) || '/' 
            || extract(day from birth) birthday
      from emp) emp_b
group by birthday
order by birthday;

오잉.. 정렬이 왜 이래ㅠㅠ

추출할 때 0이 사라져서 정렬이 이상하게 된다...

그렇다고 월 일 한꺼번에 추출되는 것도 아님ㅋㅋㅋㅋ

 

물론 group by month, day로 하면 되겠지만 나는 날짜를 한 컬럼에서 보고싶다!

lpad로 0 채워넣어서 할수도 있겠지만 너무 귀찮고

그래서 / 구분자로 월일 추출해야 겠다고 생각했다!

 

 

1. TO_CHAR(날짜, 포맷) 

  • 연 : 'YYYY', 'RRRR', 'YY', 'RR'
  • 월 : 'MM', 'MON'
  • 주 : 'WW', 'IW', 'W'
  • 일 : 'DD'
  • 요일 : 'D', 'DY', 'DAY'
  • 시 : 'HH', 'HH24'
  • 분 : 'MI'
  • 초 : 'SS', 'SSSSS'

대소문자 상관없음

RR : 1900 - 1999년

YY : 2000 - 2999년

출처: https://www.databasestar.com/oracle-to_char/

select birthday, count(*)
from (
    select to_char(birth, 'MM/DD')  birthday
    from emp
) emp_b
group by birthday
order by birthday;

 

2. REGEXP_SUBSTR(문자열, 구분자, 시작위치, 순서)

  • [문자] : 문자를 포함한 문자열 찾기
    -> [a-z] : 알파벳 소문자 중 하나
  • [^문자] : 문자를 제외한 나머지 문자열 찾기 
  • + : 한 번 이상 반드시 포함
    ab+c = abc, abbc, abbbc (ac)

출처: 위키백과 정규표현식

 

잘 이해가 안가서 그냥  [^구분자]+ = split(구분자) 라고 생각하기로 했다

select birth
    , regexp_substr(birth, '[^/]+', 1, 2) month
    , regexp_substr(birth, '[^/]+', 1, 3) day
from emp;

 

regexp_substr(birth, '[^/]+', 1, 2)

/ 를 구분자로 하여 2번째 문자열 추출

맞게 추출했는지 확인!

 

select birthday, count(*)
from (select empno
            , regexp_substr(birth, '[^/]+', 1, 2) || '/' 
            || regexp_substr(birth, '[^/]+', 1, 3) birthday
      from emp) emp_b
group by birthday
order by birthday;

 

 

음.. 날짜 데이터를 다루는 함수들이 오라클은 mySQL보다 직관적이지 않다ㅜㅜ 정규표현식도...

왜 extract에 from을 넣어서 컬럼을 넣는게 맞는지 헷갈리고 함수도 regexp만 써서 에러도 몇 번 났다...  

파이썬이 제일 쉬운 듯