MSSQL DATEDIFF 사용법

2025. 6. 21. 00:34프로그램/MSSQL

 

MS SQL Server에서 날짜/시간 차이를 계산하는 함수는 주로 DATEDIFF()입니다. 이 함수는 두 날짜/시간 값 사이의 지정된 날짜 부분(년, 월, 일, 시, 분, 초 등)에 대한 차이를 반환합니다.


DATEDIFF() 함수 기본 사용법

SQL
 
DATEDIFF ( datepart , startdate , enddate )
  • datepart: 차이를 계산할 날짜/시간의 부분(단위)을 지정합니다. 문자열 또는 변수로 지정할 수 있습니다.
  • startdate: 계산을 시작할 날짜/시간 식입니다.
  • enddate: 계산을 종료할 날짜/시간 식입니다.

enddate가 startdate보다 크면 양수 값을 반환하고, enddate가 startdate보다 작으면 음수 값을 반환합니다.


datepart 인자의 종류 및 예시

datepart에는 다음과 같은 다양한 옵션이 있습니다 (대소문자 구분 없음).

datepart (약어)전체 이름설명
yy (yyyy) year 연도
qq (q) quarter 분기
mm month
dy (y) dayofyear 연중 일
dd day
wk (ww) week
hh hour 시간
mi (n) minute
ss (s) second
ms millisecond 밀리초
mcs microsecond 마이크로초
ns nanosecond 나노초
Sheets로 내보내기

DATEDIFF() 사용 예시

1. 연도(Year) 차이 계산

SQL
 
SELECT DATEDIFF(year, '2020-01-01', '2025-06-20');
-- 결과: 5 (2020년 1월 1일과 2025년 6월 20일은 5년 차이. 정확히 날짜가 1년 차이나면 1)

SELECT DATEDIFF(year, '2020-12-31', '2021-01-01');
-- 결과: 1 (두 날짜가 다른 연도에 속하면 1년을 차이로 계산)

중요: DATEDIFF는 datepart의 경계를 넘는 횟수를 계산합니다. 즉, 연도 차이를 구할 때는 두 날짜가 서로 다른 연도에 속하면 무조건 1년을 차이로 계산합니다. 실제 만 나이와는 다를 수 있습니다.

2. 월(Month) 차이 계산

SQL
 
SELECT DATEDIFF(month, '2024-01-15', '2024-03-10');
-- 결과: 2 (1월과 3월 사이의 경계가 두 번 넘었으므로)

SELECT DATEDIFF(month, '2024-12-31', '2025-01-01');
-- 결과: 1

3. 일(Day) 차이 계산

SQL
 
SELECT DATEDIFF(day, '2025-06-01', '2025-06-20');
-- 결과: 19

SELECT DATEDIFF(day, '2025-06-20 10:00:00', '2025-06-21 09:00:00');
-- 결과: 1 (날짜만 고려하고 시간은 무시하지 않음. 일 경계를 넘으면 1일 차이)

4. 시(Hour), 분(Minute), 초(Second) 차이 계산

SQL
 
SELECT DATEDIFF(hour, '2025-06-20 09:00:00', '2025-06-20 12:30:00');
-- 결과: 3 (9시에서 10시, 11시, 12시 경계를 넘었으므로)

SELECT DATEDIFF(minute, '2025-06-20 09:00:00', '2025-06-20 09:45:30');
-- 결과: 45

SELECT DATEDIFF(second, '2025-06-20 09:00:00', '2025-06-20 09:00:10');
-- 결과: 10

5. GETDATE()를 이용한 현재 시간과의 차이 계산

SQL
 
-- 현재 시각과 특정 날짜 사이의 일(day) 차이
SELECT DATEDIFF(day, '2025-01-01', GETDATE());

-- 현재 시각과 특정 날짜 사이의 분(minute) 차이
SELECT DATEDIFF(minute, '2025-06-20 09:00:00', GETDATE());

DATEDIFF_BIG() 함수 (SQL Server 2016 이상)

DATEDIFF() 함수는 반환 값이 INT 타입으로 제한되어 있어, 매우 큰 날짜/시간 차이(예: 수십억 초)를 계산할 때는 오버플로우가 발생할 수 있습니다. 이런 경우 DATEDIFF_BIG() 함수를 사용할 수 있습니다.

DATEDIFF_BIG()은 BIGINT 타입의 값을 반환하므로, 훨씬 더 큰 범위를 처리할 수 있습니다.

SQL
 
SELECT DATEDIFF_BIG(second, '1900-01-01', GETDATE());
-- 1900년 1월 1일부터 현재까지의 총 초를 BIGINT로 반환

주의사항

  • datepart의 경계: DATEDIFF 함수는 startdate와 enddate 사이에 datepart 경계가 몇 번 넘어갔는지를 계산합니다. 예를 들어, '2020-12-31'과 '2021-01-01'의 year 차이는 1년입니다. 실제 두 날짜 간의 정확한 일수를 구하려면 DATEDIFF(day, startdate, enddate)를 사용해야 합니다.
  • 시간대(Time Zone): DATEDIFF는 내부적으로 UTC로 변환하여 계산하지만, 입력되는 startdate와 enddate의 시간대 정보가 없으면 서버의 로컬 시간대를 기준으로 해석됩니다. 시간대 관리가 중요한 경우 AT TIME ZONE 절과 함께 DATETIMEOFFSET 타입을 사용하는 것을 고려해야 합니다.
  • 성능: 대량의 데이터에 DATEDIFF를 사용하는 것은 성능에 영향을 줄 수 있습니다. 특히 인덱스를 활용하기 어려운 경우가 있으므로, 쿼리 계획을 확인하여 최적화가 필요한지 점검해야 합니다.

DATEDIFF()는 SQL Server에서 날짜/시간 데이터의 차이를 계산하는 데 매우 유용하고 자주 사용되는 함수입니다. 사용하려는 datepart의 특성과 반환 값의 한계(INT)를 이해하는 것이 중요합니다.