일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Eclipse
- IPO
- 주식 청약
- 리눅스
- 자바
- java
- 자바스크립트
- 공모주 청약 일정
- Stock
- 공모주
- 공모주 청약
- SQL
- jquery
- 코드이그나이터
- JavaScript
- MYSQL
- linux
- 6월 공모주 청약 일정
- 제이쿼리
- Stock ipo
- codeigniter
- css
- 7월 공모주 청약 일정
- 오라클
- 맥
- 주식
- php
- html
- 주식 청약 일정
- Oracle
- Today
- Total
개발자의 끄적끄적
[sql/oracle]오라클 오늘 날짜와 특정 날짜를 비교하여 if문으로 조건문 넣기 [펌] 본문
[sql/oracle]오라클 오늘 날짜와 특정 날짜를 비교하여 if문으로 조건문 넣기 [펌]
예를 들어 오늘 날짜 기준으로(2019년 5월 9일) 페이지를 열면 5월 달력이 뜨며 오늘 기준으로 전 날짜들은 선택을 할 수 없게 뜨고 오늘 이후 날짜 중엔 데이터가 있는 날짜들은 선택 버튼이 뜨게 된다. 아래 스크린샷을 참고하면 될 듯 하다.
대략적인 페이지는 위와 같고 하고자 하는 것은 오늘 날짜,시간 기준으로 18시 이후가 되면 그 다음날 예약가능 버튼은 없어져야 한다.
문제는 현재 저 View 페이지의 달력 JSP 안에서 자바소스와 HTML소스가 짬뽕되어 만들어져 있기 때문에 상당히 복잡한 상태이다. 그래서 애초에 DB에서 조회해온 데이터에 18시 이후가 되면 다음날 데이터를 조회하지 않도록 하는게 나을 것 같았다.
본론
SELECT DAYS
FROM
(
SELECT TO_CHAR(BASE_MON+LEVEL-1,'YYYYMMDD') AS DAYS
FROM
(
SELECT TRUNC(SYSDATE,'MM') AS BASE_MON
FROM DUAL
) T
WHERE 1=1
CONNECT BY BASE_MON+LEVEL-1 <= LAST_DAY(BASE_MON)
)
WHERE DAYS >= TO_CHAR(SYSDATE, 'YYYYMMDD')
실제 쿼리는 위 쿼리보다 복잡하지만 간소화하여 만들어보았다. 보면 알겠지만 먼저 지금 SYSDATE 기준으로 첫 1일의 년월일 값을 구하여 그것을 바탕으로 CONNECT BY를 이용하여 그 달의 1일부터 마지막 일까지 데이터들을 생성해준다. 위 쿼리를 실행하면 아래와 같이 나온다.
참고로 WHERE절의 조건 때문에 오늘 이전의 날들은 나오지 않게 된다. 위 쿼리를 바탕으로 이것저것 쿼리가 더 추가되어 그 날에 데이터가 있는지 없는지 분간할 수 있게 되는데 지금은 별로 관계없는 부분이기도 하고 실제 운영 중인 서비스에 쓰이는 쿼리라 따로 설명하진 않겠다.
아무튼 오늘 날짜 ~ 이번 달의 마지막 날짜까지 쿼리로 구하였다. 여기서 이제 현재 시간이 18시 이후라면 내일 날짜를 없애버리는 것이 오늘의 목표이다.
SELECT DAYS
FROM
(
SELECT TO_CHAR(BASE_MON+LEVEL-1,'YYYYMMDD') AS DAYS
FROM
(
SELECT TRUNC(SYSDATE,'MM') AS BASE_MON
FROM DUAL
) T
WHERE 1=1
CONNECT BY BASE_MON+LEVEL-1 <= LAST_DAY(BASE_MON)
)
WHERE DAYS >= TO_CHAR(SYSDATE, 'YYYYMMDD');
AND DAYS NOT LIKE
CASE
WHEN TO_DATE(TO_CHAR(SYSDATE, 'YYYYMMDDHH24MI'),'YYYYMMDDHH24MI')-TO_DATE(TO_CHAR(SYSDATE, 'YYYYMMDD')||'1800', 'YYYYMMDDHH24MI') > 0 THEN TO_CHAR(SYSDATE+1, 'YYYYMMDD')
ELSE ' '
END
위와 같이 조건건을 하나 추가해주었다. 한줄한줄 살펴보자면,
AND DAYS NOT LIKE: DAYS가 오른쪽의 값과 같지 않은 것만 보여줄 것인데,
CASE WHEN TO_DATE(TO_CHAR(SYSDATE, 'YYYYMMDDHH24MI'),'YYYYMMDDHH24MI')-TO_DATE(TO_CHAR(SYSDATE, 'YYYYMMDD') ||'1800', 'YYYYMMDDHH24MI') > 0 THEN
: CASE문을 통해 조건을 걸어준다. 현재 시간을 201905091800 식으로 변환한 뒤, 역시나 오늘 날짜+’1800’을 변환하여 서로 빼준다. 현재 시간에서 오늘 날짜의 18시를 빼주었을 때, 만약 현재 시간이 18시 이전이면 음수, 18시 이후면 양수가 나오게 된다. 그래서 뒤에 조건에>0을 써주었다. 한줄로 해석하자면현재 시간이 18시 이후일 때이다.
TO_CHAR(SYSDATE+1, 'YYYYMMDD')만약 18시 이후라면 DAYS와 비교해줄 값을 오늘 날짜+1일을 하여 20190510 식으로 리턴해준다.
ELSE ' ' END다른 경우들은 모두 공백값을 리턴해준다. 그래야 NOT LIKE에 필터링 되지 않고 정상적으로 나오기 때문이다.
결과적으로 만약 18시 이전이라면AND DAYS NOT LIKE ' '이렇게 나올 것이고, 18시 이후라면AND DAYS NOT LIKE '20190510'이렇게 나오게 된다.
아래 스크린샷이 특정 시간이 지났을 경우 나오는 값들이다. 보시다시피 20190510이 빠지게 되었다.
괜히 JSP에서 Calendar나 SimpleDateFormat을 생성하여 복잡하게 날짜 비교를 하지 않고 간단하게 쿼리를 통해 해결할 수 있었다.
'개발 > sql' 카테고리의 다른 글
[sql/mysql] utf8 를 utf8mb4로 변환하기 (0) | 2020.10.10 |
---|---|
[sql/oracle] 오라클 CASE WHEN 표현식 사용법 [펌] (0) | 2020.10.07 |
[sql / oracle] SQL 활용 - 테이블 생성, 날짜 계산 ,CASE WHEN [펌] (0) | 2020.10.07 |
[sql/oracle] 오라클 함수 모음 [펌] (0) | 2020.10.05 |
[sql/oracle] 서브쿼리 Subquery 활용_ 오라클 서브쿼리 [펌] (0) | 2020.09.28 |