아래와 같은 데이터가 있다고 가정하자
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단계를 간결하게 만들어서 비교하면 바로 결과가 나오는 상황이였다.
복잡하게 생각하면 한없이 어려워 진다 (제발 이 습관좀 고쳤으면) 그래도 위 과정들을 해내기 위해 알아놓은 방법들이 아쉬우니 모두 공유해야겠다 ^^
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 |