대형 프로젝트 - C# + 유니티로 만드는 MMORPG 게임 개발/(2) 데이터베이스

SQL (4) - DATETIME

monstro 2025. 2. 5. 11:54
728x90
반응형

이번 포스트에서는 SQL에서 시간을 나타내는 자료형인 DATETIME에 대해 알아보겠습니다.

 

1) 시간 자료형에 대해 간단하게 알아보기

시간의 경우 매우 정밀하게 동작해야 하므로 기존의 자료형을 사용하기보다는

새로운 자료형을 만들어 사용하는 것이 훨씬 더 효율적입니다.

SQL에서 사용가능한 시간자료형을 간단하게 알아보면 다음과 같습니다.

  • DATE : 연/월/일
  • TIME : 시/분/초
  • DATETIME : 연/월/일/시/분/초

또한 시간 자료형을 사용하는 경우,

일정한 형식을 통해 시간의 변환이뤄지기 때문일정한 형식을 만들어 사용해야 합니다.

사용가능한 형식은 다음과 같습니다.

  • YYYY/MM/DD
  • YYYYMMDD hh:mm:ss.nnn

 

2) 문자열 자료형을 시간 자료형으로 변환하기

-- 문자열 자료형을 시간 자료형으로 변환
SELECT CAST ('20240712' AS DATETIME)

-- 문자열 자료형을 시간 자료형으로 변환 2
SELECT CAST('20240712 05:03' AS DATETIME)

 

문자열 자료형을 시간 자료형으로 변환하는 경우, CASTAS사용하여 변환할 수 있습니다.

위 2개의 쿼리의 실행 결과는 다음과 같습니다.

첫 번째 쿼리

 

두 번째 쿼리

 

SQL에서는 묵시적 형변환이 존재합니다.

만약 DateTime 자료형의 속성새로운 새로운 데이터를 추가하는 경우

CAST와 AS를 사용하지 않고 문자열을 추가해도 묵시적 형변환이 일어나 시간 자료형으로 변환됩니다.

 

3) 현재 시간 데이터를 가져오기

-- 현재 시간 데이터를 가져오기 1 
SELECT GETDATE();
-- 현재 시간 데이터를 가져오기 2 
SELECT CURRENT_TIMESTAMP

 

현재 시간을 가져오는 방법위의 2가지 쿼리로 실행할 수 있습니다.

그러나 위의 쿼리의 문제점로컬 머신의 현재 시간을 가져오는 것입니다.

 

로컬 머신의 현재 시간을 가져오게 되므로 다른 나라에서 위의 쿼리를 실행하게 되면

각 나라의 각 지역 별로 다른 현재 시간을 가져오게 됩니다.

특히 절대적인 기준이 필요한 금융 서비스나, 게임 서버의 경우 위와 같은 문제는 치명적입니다.

 

따라서 이를 위해 절대적인 시간선을 알려주는 함수가 존재합니다.

SELECT GETUTCDATE();

 

위의 함수를 사용하면 영국의 그리니치 천문대를 기준으로 하는 시간선을 반환합니다.

따라서 전 세계 어느 지역이든, 절대적인 현재 시간을 얻을 수 있습니다.

 

 

4) 시간 자료형에 대한 연산

4 - 1) 비교 연산

비교 연산을 수행하기 위한 임의의 데이터 테이블 DateTimeTest를 하나 만들었습니다.

 

해당 데이터 테이블에서 비교 연산을 수행하여 연산이 어떻게 이뤄지는지 확인해보겠습니다.

-- 시간 자료형에 대한 비교 연산
SELECT *
FROM DateTimeTest
WHERE time >= CAST('20240501' AS DATETIME)

 

실행결과는 다음과 같습니다.

 

비교 연산이 잘 이뤄져 적합한 데이터를 골라온 것을 확인할 수 있습니다.

 

4 - 2) 시간 자료형에 대한 덧셈과 뺄셈

SELECT DATEADD(YEAR, 1, '20240712');
SELECT DATEADD(MONTH, 1, '20240712');
SELECT DATEADD(DAY, 1, '20240712');
SELECT DATEADD(SECOND, 1, '20240712');

SELECT DATEADD(YEAR, -1, '20240712');
SELECT DATEADD(MONTH, -1, '20240712');
SELECT DATEADD(DAY, -1, '20240712');
SELECT DATEADD(SECOND, -1, '20240712');

 

시간 자료형에 대한 덧셈과 뺄셈DATEADD 함수를 통해 이뤄집니다.

인자로는 시간의 형태 / 연산값 / 연산 대상순서로 구성되어 있습니다.

 

위의 쿼리를 실행한 결과는 다음과 같습니다.

시간에 대한 덧셈

 

시간에 대한 뺄셈

 

연산이 잘 이뤄진 것을 확인할 수 있습니다.

 

4 - 3) 두 시간 데이터의 차이

-- 두 시간의 차이
SELECT DATEDIFF(SECOND, '20240712', '20240715')
SELECT DATEDIFF(DAY, '20240712', '20240715')
SELECT DATEDIFF(DAY, '20240715', '20240712')

 

두 시간의 차이DATEDIFF 함수를 통해 구할 수 있습니다.

인자는 순서대로 시간의 형태 / 빼지는 값 / 빼는 값으로 구성됩니다.

 

 위의 3개의 쿼리의 실행결과는 다음과 같습니다.

20240715 - 20240712의 값(초)

 

20240715 - 20240712의 값(일)

 

20240712 - 20240715의 값(일)

 

실행결과가 위와 같이 나타나는 것을 볼 수 있습니다.

 

4 - 4) 시간 자료형의 데이터 추출

마지막으로 데이터에서 시간 자료형의 데이터를 추출하는 방법을 알아보겠습니다.

-- 시간자료형 추출
SELECT DATEPART(DAY, '20240712')

-- 시간자료형 추출 2
SELECT YEAR('20240712')
SELECT MONTH('20240712')

 

시간 자료형 데이터를 추출하는 첫번째 방법은 DATEPART 함수를 사용하는 것입니다.

인자시간의 형태해당 데이터를 추출할 데이터입니다.

첫번째 쿼리의 실행 결과는 다음과 같습니다.

 

의도한 대로 날짜(=일)가 제대로 추출된 것을 확인할 수 있습니다.

 

시간 자료형 데이터를 추출하는 두번째 방법은 시간의 형태로 추출될 데이터를 감싸는 방법입니다.

인자추출될 데이터뿐입니다.

이어지는 두번째, 세번째 쿼리의 실행 결과는 다음과 같습니다.

 

 

문제없이 의도한 대로 추출된 것을 확인할 수 있습니다.

728x90
반응형