날짜 BETWEEN 연산 문제 0 7 1,015

by 최성국 [SQL Query] [2018.09.19 16:09:48]


LOG 테이블에서 2018년09월18일 ~ 2018년09월19일까지 검색을 하고 싶은데

2018년09월19일 로그들이 검색 되지 않습니다. 18일 것만 나옵니다. 아래 2 쿼리 모두다 그렇습니다.

======================================================

테이블명: LOG

SENDDATE 컬럼:  TYPE DATE

=========================

select * from LOG
where SENDDATE BETWEEN TO_DATE('2018-09-18', 'YYYY-MM-DD') AND TO_DATE('2018-09-19', 'YYYY-MM-DD'); 

select * from LOG
where SENDDATE BETWEEN TO_DATE(NVL('','2018-09-18'), 'yyyy-mm-dd') AND TO_DATE(NVL('','2018-09-19'), 'yyyy-mm-dd');  

 

 

by 신이만든지기 [2018.09.19 16:11:25]

날짜 범위가 잘못 지정됐습니다.

두번째 날짜 범위를 이렇게 지정해야 됩니다.

TO_DATE('2018-09-19 23:59:59', 'YYYY-MM-DD HH24:MI:SS'); 


by 마농 [2018.09.19 16:16:00]
-- 일자 뿐만 아니라 시분초까지 고려해야 합니다.
SELECT *
  FROM log
 WHERE senddate >= TO_DATE('2018-09-18', 'yyyy-mm-dd')
   AND senddate <  TO_DATE('2018-09-19', 'yyyy-mm-dd') + 1
;
SELECT *
  FROM log
 WHERE senddate BETWEEN TO_DATE('2018-09-18', 'yyyy-mm-dd')
                    AND TO_DATE('2018-09-19 23:59:59', 'yyyy-mm-dd hh24:mi:ss')
;
SELECT *
  FROM log
 WHERE senddate BETWEEN TO_DATE('2018-09-18', 'yyyy-mm-dd')
                    AND TO_DATE('2018-09-19', 'yyyy-mm-dd') + 0.99999
;

 


by 최성국 [2018.09.19 16:53:00]

그럼 하루치만 출력하거나, 1년치만 출력할때는

다음과 같이 하면 되나요?

하루치 출력:

      SELECT *   FROM log  WHERE senddate >= TO_DATE('2018-09-19', 'yyyy-mm-dd')

                                     AND senddate <  TO_DATE('2018-09-19', 'yyyy-mm-dd') + 1

일년치 출력:

      SELECT *   FROM log  WHERE senddate >= TO_DATE('2017-01-01', 'yyyy-mm-dd')

                                     AND senddate <  TO_DATE('2017-12-31', 'yyyy-mm-dd') + 1


by 마농 [2018.09.19 17:08:01]

추가 질문을 통해 답변을 얻고 확신을 가지려고 하시나요?
답변을 통해 스스로 원리를 이해한다면?
추가 질문을 다시 할 필요는 없을 것 같습니다.


by 최성국 [2018.09.19 18:05:11]

물론 확신 때문에 하는 거죠?

DB에서는 컬럼 타입이 DATE라고 만 나와 있어서....

제가 프로그램 언어적으로 생각을 하다 보니 궁금해져요.

C언어로 따지자면 몇 바이트 짜리의 변수인지?

마농님 예제에서 1을 더하신게 하루를 의미 하는것 아닙니까? 그렇다면

DATE TYPE은 사칙 연산시에 사용하는 정수는 무조건 날일 수(Days)를 의미하는지?

사칙 연산(+ - * /) 전부 가능한건지?

이런 생각들이 떠올라서 추가 질문을 한겁니다.

 

 


by 마농 [2018.09.19 18:14:32]

1. 오라클 DATE TYPE 은 날짜와 시간이 결합된 형태입니다.
  - TO_DATE('2018-09-19', 'yyyy-mm-dd') 은 2018-09-19 00:00:00 을 의미합니다.
  - date type 은 7byte 로 저장됩니다.
2. DATE + NUMBER 는
  - 숫자는 일수를 의미합니다.
  - TO_DATE('2018-09-19', 'yyyy-mm-dd') + 0.5 = 2018-09-19 12:00:00
  - TO_DATE('2018-09-19', 'yyyy-mm-dd') + 0.99999 = 2018-09-19 23:59:59
3. 기타 날짜 연산
  - DATE + DATE = 오류
  - DATE - DATE = 일수
  - DATE + 7 = DATE(일주일뒤)
  - DATE - 7 = DATE(일주일전)
  - DATE - 1/24 = DATE(한시간전)
  - DATE - 1/24/60 = DATE(1분전)
  - DATE - 1/24/60/60 = DATE(1초전)


by 최성국 [2018.09.19 21:52:30]

오~~~ 소중한 자료 감사합니다.

DATE + DATE = 오류 <= 특히 이부분 정말 유용한 참고 사항입니다.  저렇게 더하기는 안되는 군요.  그렇다면

"DATE - DATE" 에서 1항의 날짜 > 2항의 날짜   <= 이런 관계라야지 성립이 될것 같군요. 아니면 결과 값이 마이너스가 나오거나요. 암튼.

마농님 정말 감사합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입