다음을 통해 공유


DATEDIFF_BIG(Transact-SQL)

적용 대상: SQL Server 2016(13.x) 이상 Azure SQL 데이터베이스 Azure SQL Managed Instance

이 기능은 지정된 startdateenddate 사이에 지정된 datepart 경계의 수(부호 있는 큰 정수 값으로)를 반환합니다.

모든 Transact-SQL 날짜/시간 데이터 형식 및 함수에 대한 개요는 날짜 및 시간 데이터 형식 및 함수(Transact-SQL)를 참조하세요.

Transact-SQL 구문 표기 규칙

구문

DATEDIFF_BIG ( datepart , startdate , enddate )  

인수

datepart
겹쳐지는 범위의 유형을 지정하는 startdateenddate 부분입니다.

참고

DATEDIFF_BIG는 사용자 정의 변수 또는 따옴표 붙은 문자열의 datepart 값을 허용하지 않습니다.

다음 표에는 유효한 datepart 인수 이름과 약어가 모두 나와 있습니다.

datepart 이름 datepart 약어
year yy, yyyy
quarter qq, q
month mm, m
dayofyear dy, y
day dd, d
week wk, ww
hour hh
minute mi, n
second ss, s
millisecond ms
microsecond mcs
nanosecond ns

참고

각 특정 datepart 이름과 해당 datepart 이름의 약어는 동일한 값을 반환합니다.

startdate
다음 값 중 하나를 확인할 수 있는 식입니다.

  • date
  • datetime
  • datetimeoffset
  • datetime2
  • smalldatetime
  • time

date의 경우 DATEDIFF_BIG은 열 식, 식, 문자열 리터럴 또는 사용자 정의 변수를 허용합니다. 문자열 리터럴 값은 datetime을 확인해야 합니다. 모호성 문제를 피하려면 4자리 연도를 사용하세요. DATEDIFF_BIGenddate에서 startdate를 뺍니다. 모호성을 피하려면 4자리 연도를 사용하세요. 두 자리 연도에 대한 정보는 두 자리 연도 구분 서버 구성 옵션 구성을 참조하세요.

enddate
startdate를 참조하세요.

반환 형식

서명된 bigint

Return Value

startdateenddate 사이의 bigint 차이를 반환하며, datepart에 설정된 경계로 표시됩니다.

bigint에 대한 범위를 벗어난 반환 값의 경우(-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807) DATEDIFF_BIG에서 오류를 반환합니다. int를 반환하여 이상을 오버플로할 수 있는 것과 달리, DATEDIFF_BIGenddatestartdate 간의 차이가 292년, 3개월, 10일, 23시간, 47분 및 16.8547758초를 넘는 나노초 정밀도를 사용하는 경우에만 오버플로할 수 있습니다.

startdateenddate에 둘 다 시간 값만 할당되고 datepart가 시간 datepart가 아니면 DATEDIFF_BIG는 0을 반환합니다.

DATEDIFF_BIG는 반환 값을 계산하기 위해 startdate 또는 enddate의 표준 시간대 오프셋 구성 요소를 사용합니다.

startdate 또는 enddate에 사용된 smalldatetime 값의 경우 smalldatetime은 분 단위까지만 정확하므로 DATEDIFF_BIG은 반환 값에서 초와 밀리초를 항상 0으로 설정합니다.

날짜 데이터 형식의 변수에 시간 값만 할당된 경우 DATEDIFF_BIG은 누락된 날짜 부분 값을 기본값인 1900-01-01로 설정합니다. 시간 또는 날짜 데이터 형식의 변수에 날짜 값만 할당될 경우 DATEDIFF_BIG는 누락된 시간 부분 값을 기본값인 00:00:00으로 설정합니다. startdate 또는 enddate 중 하나는 시간 부분만 있고 다른 하나는 날짜 부분만 있는 경우 DATEDIFF_BIG는 누락된 시간 및 날짜 부분을 기본값으로 설정합니다.

startdateenddate가 날짜 데이터 형식이 다르고 한 쪽의 시간 부분 또는 소수 자릿수 초의 전체 자릿수가 다른 쪽보다 많을 경우 DATEDIFF_BIG는 다른 쪽의 누락된 부분을 0으로 설정합니다.

datepart 범위

다음 명령문은 동일한 startdate와 동일한 endate 값을 가집니다. 이 날짜는 서로 인접하며 100나노초(.0000001초)만큼 시간이 다릅니다. 각 문에서 startdateendate 사이의 차이는 해당 datepart에서 하나의 달력 또는 시간 범위를 넘어섭니다. 각 문은 1을 반환합니다. startdate 및 enddate의 연도 값이 다르지만 달력 주 값 DATEDIFF_BIG 이 같으면 datepart week에 대해 0을 반환합니다.

SELECT DATEDIFF_BIG(year,        '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(quarter,     '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(month,       '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(dayofyear,   '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(day,         '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(week,        '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(hour,        '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(minute,      '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(second,      '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(millisecond, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');

설명

SELECT <list>, WHERE, HAVING, GROUP BYORDER BY 절에서 DATEDIFF_BIG를 사용합니다.

DATEDIFF_BIG는 문자열 리터럴을 datetime2 형식으로 암시적으로 캐스팅합니다. 즉, DATEDIFF_BIG는 데이터가 문자열로 전달될 때 형식 YDM을 지원하지 않습니다. YDM 형식을 사용하려면 문자열을 datetime 또는 smalldatetime 형식으로 명시적으로 캐스팅해야 합니다.

SET DATEFIRST 지정은 DATEDIFF_BIG에 영향을 주지 않습니다. DATEDIFF_BIG은 항상 일요일을 한 주의 첫 날로 사용하여 함수가 결정적으로 작동하게 합니다.

enddatestartdate 간의 차이가 bigint의 범위를 벗어난 값을 반환하는 경우 DATEDIFF_BIG나노초로 오버플로할 수 있습니다.

예제

startdate 및 enddate에 대한 열 지정

이 예에서는 여러 유형의 식을 startdateenddate 매개 변수에 대한 인수로 사용합니다. 테이블의 두 열 사이에 겹쳐지는 날짜 범위의 수를 계산합니다.

CREATE TABLE dbo.Duration  
    (startDate datetime2, endDate datetime2);  
    
INSERT INTO dbo.Duration(startDate,endDate)  
    VALUES('2007-05-06 12:10:09', '2007-05-07 12:10:09');  
    
SELECT DATEDIFF_BIG(day, startDate, endDate) AS 'Duration'  
    FROM dbo.Duration;  
-- Returns: 1  

날짜 부분 문자열로 startdate와 enddate 간의 차이점 찾기

DECLARE @date1 DATETIME2, @date2 DATETIME2, @result VARCHAR(100)
DECLARE @years BIGINT, @months BIGINT, @days BIGINT, @hours BIGINT, @minutes BIGINT, @seconds BIGINT, @milliseconds BIGINT

SET @date1 = '0001-01-01 00:00:00.00000000'
SET @date2 = '2018-12-12 07:08:01.12345678'

SELECT @years = DATEDIFF(yy, @date1, @date2)
IF DATEADD(yy, -@years, @date2) < @date1 
SELECT @years = @years-1
SET @date2 = DATEADD(yy, -@years, @date2)

SELECT @months = DATEDIFF(mm, @date1, @date2)
IF DATEADD(mm, -@months, @date2) < @date1 
SELECT @months=@months-1
SET @date2= DATEADD(mm, -@months, @date2)

SELECT @days=DATEDIFF(dd, @date1, @date2)
IF DATEADD(dd, -@days, @date2) < @date1 
SELECT @days=@days-1
SET @date2= DATEADD(dd, -@days, @date2)

SELECT @hours=DATEDIFF(hh, @date1, @date2)
IF DATEADD(hh, -@hours, @date2) < @date1 
SELECT @hours=@hours-1
SET @date2= DATEADD(hh, -@hours, @date2)

SELECT @minutes=DATEDIFF(mi, @date1, @date2)
IF DATEADD(mi, -@minutes, @date2) < @date1 
SELECT @minutes=@minutes-1
SET @date2= DATEADD(mi, -@minutes, @date2)

SELECT @seconds=DATEDIFF(s, @date1, @date2)
IF DATEADD(s, -@seconds, @date2) < @date1 
SELECT @seconds=@seconds-1
SET @date2= DATEADD(s, -@seconds, @date2)

SELECT @milliseconds=DATEDIFF(ms, @date1, @date2)

SELECT @result= ISNULL(CAST(NULLIF(@years,0) AS VARCHAR(10)) + ' years,','')
     + ISNULL(' ' + CAST(NULLIF(@months,0) AS VARCHAR(10)) + ' months,','')    
     + ISNULL(' ' + CAST(NULLIF(@days,0) AS VARCHAR(10)) + ' days,','')
     + ISNULL(' ' + CAST(NULLIF(@hours,0) AS VARCHAR(10)) + ' hours,','')
     + ISNULL(' ' + CAST(@minutes AS VARCHAR(10)) + ' minutes and','')
     + ISNULL(' ' + CAST(@seconds AS VARCHAR(10)) 
          + CASE WHEN @milliseconds > 0 THEN '.' + CAST(@milliseconds AS VARCHAR(10)) 
               ELSE '' END 
          + ' seconds','')

SELECT @result

결과 집합은 다음과 같습니다.

2017 years, 11 months, 11 days, 7 hours, 8 minutes and 1.123 seconds

더 자세한 예는 DATEDIFF(Transact-SQL)를 참조합니다.

추가 정보

CAST 및 CONVERT(Transact-SQL)
DATEDIFF(Transact-SQL)