본문 바로가기

Server Oriented/DB-Oracle

밤 12시 정각은 어제 또는 오늘..? DB 나 웹서버 시스템에게 24:00:00 또는 00:00:00 이란..?

일단, 오라클 DB 를 예로 들면..

1. 24:00:00 이란 없고,

2. 00:00:00 은 어제가 아니라 오늘. 다만, 이 값이 표시된 일자를 따른다


상기 내용을 부연 설명하면..

2015-09-24 23:59:59 는 9/24 밤 11시 59분 59초다.

그렇다면 00:00:00 는..?

9/24 23시 59분 59초 다음의 0시 0분 0초는 9/24 이 아니라, 9/25 이다.

그래서 이렇게 표시된다, 2015-09-25 00:00:00.


결국, 오라클 DB에게 있어서 하루는..

00:00:00 부터 23:59:59 까지 있는 셈이다.


그런데, 23:59:59 는 천분의 일초 개념으로 다음 날 00:00:00 전에 존재하는 모든 밀리세컨드를 포함한다.

시간을 세분화 하여 어제와 오늘의 경계에 있는,

어제의 23:59:59 와 오늘의 00:00:00 사이에 숨어 있는 어떤 특정 시간은 모두 어제에 속한다.

어제의 23:59:59 와 오늘의 00:00:00 사이에 있는 수 많은 밀리 세컨드의 순간들은 모두 어제에 속한다.


웹서버도 DB서버도 모두 동일한 개념을 따진다고 볼 수 있다.


만약 date type 으로 ins_date 라는 칼럼이 있고 여기에 index 가 걸려 있어서 이를 사용해야 하는데,

일정 일자 범위를 세팅하려면(ins_date 에 function 을 입히면 인덱스를 타지 않는다)..

ins_date between trunc(sysdate) and trunc(sysdate+1) 이라 할 때, 논리 상의 문제가 발생할 수 있다.

물론, ins_date 에는 sysdate 값이 들어간다 하면 내일 일자가 없기 때문에 문제는 없다.


다만, 어제 일자 기준으로 데이타를 추출할 때가 문제가 되겠다..

ins_date between trunc(sysdate-1) and trunc(sysdate) 라고 하면 오늘 새벽 00:00:00 가 들어가니까 문제가 된다.

이 때에는, ins_date >= trunc(sysdate-1) and ins_date < trunc(sysdate) 라고 해야 하겠다..


.Fine.