서론
날짜/시간 데이터
를 저장하는 방법은 데이터베이스 제품에 따라 크게 달라진다.
날짜와 시간 전부를 저장할 수 있는 자료형을 지원하거나, 혹은 날짜는 DATE
형, 시간은 TIME
형, 날짜와 시간은 DATETIME
형과 같이 세분화해서 지원하는 데이터베이스 제품도 있다.
이 책에서는 날짜와 시간을 초 단위로 저장할 수 있는 날짜시간형
을 중점으로 설명하겠다.
1. SQL에서의 날짜
날짜나 시간 데이터는 수치 데이터와 같이 사칙 연산
을 할 수 있다.
날짜시간 데이터를 연산하면 결괏값으로 동일한 날짜시간 유형의 데이터
를 반환하는 경우도 있으며 기간(간격)의 차를 나타내는 기간형(interval) 데이터
를 반환하는 경우도 있다.
기간형은 '10일간', '2시간 10분'과 같이 시간의 간격을 표현한다.
날짜 시간형 데이터의 연산을 설명하기 전에 시스템 날짜
를 확인하는 방법에 관해 설명하겠다.
컴퓨터에는 반드시 시계가 내장되어 있다.
네트워크나 주변기기와 데이터통신을 하기 위해서는 시간을 정확하게 측정할 필요가 있기 때문이다.
시스템 날짜란 이 같은 '하드웨어 상의 시계로부터 실시간으로 얻을 수 있는 일시적인 데이터'
를 말한다.
표준 SQL에서는 'CURRENT_TIMESTAMP'
라는 긴 이름이 함수를 사용한다.
CURRENT_TIMESTAMP는 함수임에도 인수를 필요로 하지 않는다.
일반적인 함수와는 달리 인수를 지정할 필요가 없으므로 괄호를 사용하지 않아도 되는
특수한 함수이다.
SELECT CURRENT_TIMESTAMP;
앞의 예에서는 FROM
구를 생략
했다.
SELECT 구만으로도 SELECT 명령은 실행되지만 Oracle
과 같은 전통적인 데이터베이스에서는 FROM 구를 생략할 수 없으므로 주의해야 한다.
이미 언급했듯이 CURRENT_TIMESTAMP는 표준 SQL로 규정되어 있는 함수이다.
Oracle에서는 SYSDATE
함수, SQL Server에서는 GETDATE
함수를 사용해도 시스템 날짜를 확인할 수 있다.
그러나 이들은 표준화되기 전에 구현된 함수인 만큼 사용하지 않는 편이 낫다.
날짜 서식
은 국가별로 다르다.
한국과 일본에서는 '연/월/일'
을 슬래시(/)
나 하이픈(-)
으로 구분해 표기하는 경우가 많다.
한편 미국에서는 월의 경우 숫자를 대신해 Jan
, Feb
등으로 표기하며 일반적으로 '일/월/년'
의 순으로 표기한다.
2022/01/01
or 2022-01-01
01 Jan 2022
이처럼 날짜를 표기하는 방식이 다양한 가운데 대부분의 데이터베이스 제품은 날짜 데이터의 서식을 임의로 지정, 변환
할 수 있는 함수를 지원한다.
Oracle의 경우 TO_DATE
함수, MySQL은 DATE_FORMAT
함수를 지원한다.
우리가 사용할 DATE_FORMAT 함수에는 서식을 바꿀 데이터(열)
과 서식
을 인자로 넘겨주며 이때 서식의 형태는 다양하게 지정할 수 있다.
여기서는 가장 많이 쓰이는 서식 한 가지만 살펴보겠다.
SELECT *, DATE_FORMAT(date, '%Y/%m/%d') FROM sample_table WHERE id=1;
2. 날짜의 덧셈과 뺄셈
날짜시간형 데이터는 기간형 수치데이터
와 덧셈
및 뺄셈
을 할 수 있다.
날짜시간형 데이터에 기간형 수치데이터를 더하거나 빼면 날짜시간형 데이터
가 반환된다.
SELECT CURRENT_DATE() + INTERVAL 1 DAY;
CURRENT_DATE
는 시스템 날짜의 날짜만
확인하는 함수이다.
이 함수도 인수를 필요로 하지 않는 함수이므로 괄호를 생략할 수 있다.
한편 INTERVAL 1 DAY
는 '1일 후'
라는 의미의 기간형 상수
이다.
날짜시간형 데이터 간에 뺄셈
을 할 수 있다.
예를 들면 Oracle에서는 '2022-02-01' - '2022-01-01'
이라고 한다면 두 날짜 사이에 차이가 얼마나 발생하는지 계산할 수 있다.
한편 MySQL에서는 DATEDIFF
함수로 계산할 수 있다.
SELECT *, DATEDIFF(date2, date1) FROM sample_table;