상세 컨텐츠

본문 제목

[Oracle] 시간 / DATE / 지금으로부터 16시간 차이나는 값만 가지고오기 ..

백앤드 개발 노트

by bydawn25 2022. 8. 18. 09:16

본문

 

 

 

 

 

아래와 같은 데이터가 있다고 가정하자

  DATE_VALUES
1 2022/08/01 05:02:59
2 2022/08/02 15:02:59
3 2022/08/16 23:11:30
4 2022/08/17 09:00:00
5 2022/08/17 16:00:00

 

 

 

 

 

 

지금 시간 : 2022/08/17 16:00:00

 

지금 시간으로 부터 16시간 전 값들만 가지고 오고 싶다면 해당하는 데이터는 1, 2, 3번이 되서 아래와 같은 결과를 가져와야 한다.

  DATE_VALUES
1 2022/08/01 05:02:59
2 2022/08/02 15:02:59
3 2022/08/16 23:11:30

 

 

 

 

 

 

흠흠 .. 쉽지 않군

 

처음에 생각했던 로직은 이러했다

 

1. 현재시간에서 16시간을 뺀 값을 'YYYY/MM/DD HH24:MI:SS'로 만든다
2. 그 값을 DATE_VALUES와 비교한다
3. HOUR만 빼낸다
4. HOUR이 양수면 TRUE

 

그런데 생각해보니 그렇게 복잡하게 갈 필요가 없었다.

 

위에서 1, 2단계를 간결하게 만들어서 비교하면 바로 결과가 나오는 상황이였다.

 

 

복잡하게 생각하면 한없이 어려워 진다 (제발 이 습관좀 고쳤으면) 그래도 위 과정들을 해내기 위해 알아놓은 방법들이 아쉬우니 모두 공유해야겠다 ^^

 

 

 

 

 

 

Date 타입 빼기

oracle date타입은 -(빼기)를 이용하면 손쉽게 구현할 수 있다. 결과는 "일 수"로 나온다.

DATE_VALUES - 1 // 하루빼기
DATE_VALUES - 10/24 // 10시간 빼기
DATE_VALUES - TO_DATE('2022/08/02 15:02:59', 'YYYY/MM/DD HH24:MI:SS') // 특정한 시간으로 빼기

이렇게 빼면 1, 123, -0.5 같이 float number들로 나오게 되는데 당황하지 마시길 ~ 위에서 말했듯이 "일 수"이다.

 

 

그러니까 1이면 하루가 지났다는거고, -0.5이면 12시간 전이라는 이야기다. 

 

처음에 이 숫자들을 보고 뭐지?? 했다 ㅋㅋㅋ

 

 

 

 

 

뺀 결과 값을 보기 좋게 만들기

아 여기서 한참해맸다!! 저 "일 수"들을 '년/월/일 시:분:초'로 만들어야 하는데 도저히 방법을 찾을 수가 없었다.

 

그래서 60으로 나누고 ㅎ 더하고 ㅎ 해야하나 고민하던중에 찾았다.

NUMTODSINTERVAL( 뺀 결과 값, 'DAY' )

이렇게 하면 예쁘게 시간이 정돈되어 나온다.

 

 

여기서 시간만 필요하다면 EXTRACT함수를 사용하면 된다.

EXTRACT(HOUR FROM NUMTODSINTERVAL( 뺀 결과 값, 'DAY' ))

이제 차이나는 시간값들을 한눈에 볼 수 있다.

 

 

 

실제 사용한 방법

DATE_VALUES < SYSDATE - 16/24

사실 위의 fancy한 함수들은 거의 사용하지 않았다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 결국 부등호를 사용해서 간단하게 구현하였다.

 

이렇게 하면 16시간 전인 시간을 모두 골라낼 수 있다.

 

CASE
    WHEN DATE_VALUES < SYSDATE - 16/24 THEN 'OVER'
    ELSE 'NOT OVER'
END

이런식으로 CASE를 사용하면 깔끔하게 16시간이 지났는지 아닌지 눈으로 확인할 수 있다.

 

 

 

쉬운 길 놔두고 삽질 오지게 했지만 덕분에 DATE의 산수, TRUNC, EXTRACT, NUMTODSINTERVER같은 함수를 알게 되었으니 하루 고생한 값이라 치겠다 ^^

 

아 머리가 아프다 .. 졸리고 .. 집에 가고 싶네 증말

 

 

 

 

 

'백앤드 개발 노트' 카테고리의 다른 글

[MongoDB] 명령어모음  (0) 2023.04.06
[Oracle] Oracle에서 listagg를 사용해보자  (0) 2022.02.28
[개념]with과 recursive  (0) 2021.01.03

관련글 더보기