다음을 통해 공유


DATEDIFF(Transact-SQL)

지정된 startdate와 enddate 간에 겹쳐지는 지정된 datepart 범위의 수(부호 있는 정수)를 반환합니다.

모든 Transact-SQL 날짜/시간 데이터 형식 및 함수에 대한 개요는 날짜 및 시간 함수(Transact-SQL)를 참조하십시오. 날짜/시간 데이터 형식 및 함수에 대한 자세한 내용과 일반적인 예는 날짜 및 시간 데이터 사용을 참조하십시오.

항목 링크 아이콘Transact-SQL 구문 표기 규칙

구문

DATEDIFF ( datepart , startdate , enddate )

인수

  • datepart
    겹쳐지는 범위의 유형을 지정하는 startdate와 enddate 부분입니다. 다음 표에서는 올바른 모든 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

  • startdate
    time, date, smalldatetime, datetime, datetime2 또는 datetimeoffset 값으로 확인될 수 있는 식입니다. date는 식, 열 식, 사용자 정의 변수 또는 문자열 리터럴일 수 있습니다. enddate에서 startdate를 뺍니다.

    모호성을 피하려면 4자리 연도를 사용하십시오. 2자리 연도에 대한 자세한 내용은 two digit year cutoff 옵션을 참조하십시오.

  • enddate
    startdate를 참조하십시오.

반환 형식

int

반환 값

  • 각 datepart와 해당 약어는 동일한 값을 반환합니다.

반환 값이 int에 대한 범위(-2,147,483,648에서 +2,147,483,647 사이)를 벗어날 경우 오류가 반환됩니다. millisecond의 경우 startdate와 enddate 사이의 최대 차이는 24일, 20시간, 31분, 23.647초입니다. second의 경우 최대 차이는 68년입니다.

startdate와 enddate가 모두 시간 값으로만 할당되고 datepart가 시간 datepart가 아닐 경우 0이 반환됩니다.

startdate 또는 endate의 표준 시간대 오프셋 구성 요소는 반환 값을 계산하는 데 사용되지 않습니다.

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

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

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

datepart 범위

다음 문은 동일한 startdate와 동일한 endate를 가집니다. 이러한 날짜는 서로 인접하며 차이는 .0000001초입니다. 각 문에서 startdate와 endate 사이의 차이는 해당 datepart에서 하나의 달력 또는 시간 범위를 넘어섭니다. 각 문은 1을 반환합니다. 이 예에서 다른 연도가 사용되고 startdate와 endate가 달력의 같은 주에 있을 경우 week에 대한 반환 값은 0이 됩니다.

SELECT DATEDIFF(year, '2005-12-31 23:59:59.9999999'

, '2006-01-01 00:00:00.0000000');

SELECT DATEDIFF(quarter, '2005-12-31 23:59:59.9999999'

, '2006-01-01 00:00:00.0000000');

SELECT DATEDIFF(month, '2005-12-31 23:59:59.9999999'

, '2006-01-01 00:00:00.0000000');

SELECT DATEDIFF(dayofyear, '2005-12-31 23:59:59.9999999'

, '2006-01-01 00:00:00.0000000');

SELECT DATEDIFF(day, '2005-12-31 23:59:59.9999999'

, '2006-01-01 00:00:00.0000000');

SELECT DATEDIFF(week, '2005-12-31 23:59:59.9999999'

, '2006-01-01 00:00:00.0000000');

SELECT DATEDIFF(hour, '2005-12-31 23:59:59.9999999'

, '2006-01-01 00:00:00.0000000');

SELECT DATEDIFF(minute, '2005-12-31 23:59:59.9999999'

, '2006-01-01 00:00:00.0000000');

SELECT DATEDIFF(second, '2005-12-31 23:59:59.9999999'

, '2006-01-01 00:00:00.0000000');

SELECT DATEDIFF(millisecond, '2005-12-31 23:59:59.9999999'

, '2006-01-01 00:00:00.0000000');

주의

DATEDIFF는 SELECT 목록, WHERE, HAVING, GROUP BY 및 ORDER BY 절에서 사용할 수 있습니다.

SQL Server 2008부터 DATEDIFF는 문자열 리터럴을 datetime2 형식으로 암시적으로 캐스팅합니다. 즉, 날짜가 문자열로 전달될 때 DATEDIFF에서 더 이상 YDM 형식을 지원하지 않습니다. YDM 형식을 사용하려면 문자열을 datetime 또는 smalldatetime 형식으로 명시적으로 캐스팅해야 합니다.

다음 예에서는 여러 형식의 식을 startdate 및 enddate 매개 변수에 대한 인수로 사용합니다.

1. startdate 및 enddate에 대한 열 지정

다음 예에서는 테이블의 두 열 사이에 겹쳐지는 날짜 범위의 수를 계산합니다.

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(day,startDate,endDate) AS 'Duration'
FROM dbo.Duration;
-- Returns: 1

2. startdate 및 enddate에 대한 사용자 정의 변수 지정

다음 예에서는 사용자 정의 변수를 startdate 및 enddate 인수로 사용합니다.

DECLARE @startdate datetime2 = '2007-05-05 12:10:09.3312722';
DECLARE @enddate datetime2 = '2007-05-04 12:10:09.3312722'; 
SELECT DATEDIFF(day, @startdate, @enddate);

3. startdate 및 enddate에 대한 스칼라 시스템 함수 지정

다음 예에서는 스칼라 시스템 함수를 startdate 및 enddate 인수로 사용합니다.

SELECT DATEDIFF(millisecond, GETDATE(), SYSDATETIME());

4. startdate 및 enddate에 대한 스칼라 하위 쿼리 및 스칼라 함수 지정

다음 예에서는 스칼라 하위 쿼리 및 스칼라 함수를 startdate 및 enddate 인수로 사용합니다.

USE AdventureWorks2008R2;
GO
SELECT DATEDIFF(day,(SELECT MIN(OrderDate) FROM Sales.SalesOrderHeader),
    (SELECT MAX(OrderDate) FROM Sales.SalesOrderHeader));

5. startdate 및 enddate에 대한 상수 지정

다음 예에서는 문자 상수를 startdate 및 enddate 인수로 사용합니다.

SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635'
    , '2007-05-08 09:53:01.0376635');

6. enddate에 대한 숫자 식 및 스칼라 시스템 함수 지정

다음 예에서는 (GETDATE ()+ 1) 숫자 식, GETDATE 스칼라 시스템 함수 및 SYSDATETIME을 enddate 인수로 사용합니다.

USE AdventureWorks2008R2;
GO
SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635', GETDATE()+ 1) 
    AS NumberOfDays
FROM Sales.SalesOrderHeader;
GO
USE AdventureWorks2008R2;
GO
SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635', DATEADD(day,1,SYSDATETIME())) AS NumberOfDays
FROM Sales.SalesOrderHeader;
GO

7. startdate에 대한 순위 함수 지정

다음 예에서는 순위 함수를 startdate 인수로 사용합니다.

USE AdventureWorks2008R2;
GO
SELECT p.FirstName, p.LastName
    ,DATEDIFF(day,ROW_NUMBER() OVER (ORDER BY 
        a.PostalCode),SYSDATETIME()) AS 'Row Number'
FROM Sales.SalesPerson s 
    INNER JOIN Person.Person p 
        ON s.BusinessEntityID = p.BusinessEntityID
    INNER JOIN Person.Address a 
        ON a.AddressID = p.BusinessEntityID
WHERE TerritoryID IS NOT NULL 
    AND SalesYTD <> 0;

8. startdate에 대한 집계 창 함수 지정

다음 예에서는 집계 창 함수를 startdate 인수로 사용합니다.

USE AdventureWorks2008R2;
GO
SELECT soh.SalesOrderID, sod.ProductID, sod.OrderQty,soh.OrderDate
    ,DATEDIFF(day,MIN(soh.OrderDate) 
        OVER(PARTITION BY soh.SalesOrderID),SYSDATETIME() ) AS 'Total'
FROM Sales.SalesOrderDetail sod
    INNER JOIN Sales.SalesOrderHeader soh
        ON sod.SalesOrderID = soh.SalesOrderID
WHERE soh.SalesOrderID IN(43659,58918);
GO

참고 항목

참조