티스토리 뷰



이기종 데이터베이스를 사용하더라도 데이터베이스 간의 주요 데이터 타입은 유사하게 지원하는 것이 보통입니다. 대표적인 것이 문자열, 정수와 함께 일자시간 타입입니다. 


위의 스키마는 3개의 컬럼을 가지고 있는 테이블로 tagname과 dt를 기준으로 주키(Primary key)를 설정한 것입니다. 위의 스키마를 각 데이터베이스 별 CREATE 문으로 작성하면 아래와 같습니다. 오라클만 DATE 타입을 사용하고 MySQL과 SQL Server는 DATETIME 타입을 사용합니다.

== MySQL ==

CREATE TABLE tags (tagname VARCHAR(16), dt DATETIME, val INT, PRIMARY KEY(tagname, dt));

== SQL Server ==

CREATE TABLE tags (tagname VARCHAR(16), dt DATETIME, val INT, PRIMARY KEY(tagname, dt));

== Oracle ==

CREATE TABLE tags (tagname VARCHAR2(16), dt DATE, val INTEGER, PRIMARY KEY(tagname, dt));


SQL 질의에서 문자열 항목은 tagname = 'A001' 처럼 작은 따옴표로 문자열을 감싸주어 비교하고 숫자 항목은 따옴표 없이 val < 1000 처럼 직접 값을 기술해서 처리하면 됩니다. 문제는 일시 타입의 컬럼입니다. 예를 들어 오후 2시 10분 대의 모든 기록을 조회하려면 "dt >= '2015-10-22 14:10:00' AND dt <= '2015-10-22 14:10:59'" 와 같은 질의를 WHERE 문장에 포함시키면 됩니다. 그렇지만 이 문장은 MySQL과 SQL Server에서만 유효합니다. 실제로 '2015-10-22 14:10:00'는 문자열일뿐이지 데이터베이스 입장에서는 일시가 아니기 때문하지만 오라클에서는 해당 문자열을 TO_DATE() 함수를 통해서 일시로 명시적으로 지정해 주어야 합니다. MySQL과 SQL Server에서는 알아서 변환 사용한다는 의미입니다. 아래는 각 데이터베이스에서 오후 2시 10분 대의 모든 기록을 조회하는 예제 질의입니다.

== MySQL ==

SELECT * FROM tags WHERE dt >= '2015-10-22 14:10:00' AND dt <= '2015-10-22 14:10:59';

== SQL Server ==

SELECT * FROM tags WHERE dt >= '2015-10-22 14:10:00' AND dt <= '2015-10-22 14:10:59';

== Oracle ==

SELECT * FROM tags WHERE dt >= TO_DATE('2015-10-22 14:10:00', 'YYYY-MM-DD HH24:MI:SS')

 AND dt <= TO_DATE('2015-10-22 14:10:59', 'YYYY-MM-DD HH24:MI:SS');


다음은 MySQL, SQL Server, Oracle 간의 일시 연관 데이터 타입의 비교 테이블입니다.


 SQL Server

MySQL 

 오라클

 DATE

 DATE

DATE 

 DATETIME

 DATETIME

DATE

 DATETIME2

 DATETIME

DATE 

 SMALLDATETIME

 DATETIME

 DATE

 DATETIMEOFFSET

 DATETIME

DATE 

 TIME

 TIME

 DATE

 TIMESTAMP

 DATETIME

 DATE

ROWVERSION 

 DATETIME

 DATE



댓글
댓글쓰기 폼