날짜 연산

유석현(SeokHyun Yu)·2022년 8월 9일
0

SQL

목록 보기
14/45
post-thumbnail

서론

날짜/시간 데이터를 저장하는 방법은 데이터베이스 제품에 따라 크게 달라진다.

날짜와 시간 전부를 저장할 수 있는 자료형을 지원하거나, 혹은 날짜는 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;

profile
Backend Engineer

0개의 댓글