now is better than never
[Oracle] 날짜 데이터 년, 월, 일 추출하기 - TO_CHAR, REGEXP_SUBSTR 본문
생년월일 데이터로 같은 생일인 사람이 있는지 알고 싶은데 오라클에 년, 월, 일 추출 함수가 없나...?
찾아보니 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만 써서 에러도 몇 번 났다...
파이썬이 제일 쉬운 듯
'SQL > 프로젝트' 카테고리의 다른 글
[Oracle] 상관계수 구하기 - corr (0) | 2022.12.07 |
---|---|
[Oracle] 달러-원화 환율 데이터 분석하기 (0) | 2022.12.05 |
[Oracle] 공공데이터 서울 상가(상권)정보 분석하기 2 (0) | 2022.12.02 |
[Oracle] 이메일에서 도메인 추출하기 - INSTR, SUBSTR, REGEXP_SUBSTR / 첫 번째 행 출력하기 - (LIMIT, TOP) (0) | 2022.12.02 |
[Oracle] 공공데이터 서울 상가(상권)정보 분석하기 1 - PIVOT (0) | 2022.12.01 |