DATEDIFF(Transact-SQL)
지정된 startdate와 enddate 간에 겹쳐지는 지정된 datepart 범위의 수(부호 있는 정수)를 반환합니다.
모든 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 또는 enddate의 표준 시간대 오프셋 구성 요소는 반환 값을 계산하는 데 사용되지 않습니다.
smalldatetime은 분 단위까지만 정확하므로 startdate 또는 enddate에 smalldatetime 값이 사용될 경우 반환 값에서 초와 밀리초는 항상 0으로 설정됩니다.
날짜 데이터 형식의 변수에 시간 값만 할당된 경우 누락된 날짜 부분의 값은 기본값인 1900-01-01로 설정되고, 1900-01-01. 시간 또는 날짜 데이터 형식의 변수에 날짜 값만 할당될 경우 누락된 시간 부분의 값은 기본값인 00:00:00으로 설정됩니다. 00:00:00. startdate 또는 enddate 중 하나는 시간 부분만 있고 다른 하나는 날짜 부분만 있는 경우 누락된 시간 및 날짜 부분은 기본값으로 설정됩니다.
startdate와 enddate의 날짜 데이터 형식이 다르고 한 쪽의 시간 부분 또는 소수 자릿수 초의 전체 자릿수가 다른 쪽보다 많을 경우 다른 쪽에서 누락된 부분은 0으로 설정됩니다.
datepart 범위
다음 문은 동일한 startdate와 동일한 enddate를 가집니다. 이러한 날짜는 서로 인접하며 차이는 .0000001초입니다. 각 문에서 startdate와 enddate 사이의 차이는 해당 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와 DATEADD를 함께 사용할 때는 문자열 리터럴을 암시적으로 캐스팅하지 않는 것이 좋습니다. 자세한 내용은 DATEADD(Transact-SQL)를 참조하십시오.
예
다음 예에서는 여러 유형의 식을 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 AdventureWorks;
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 인수로 사용합니다.
[!참고]
SYSDATETIME, SYSUTCDATETIME 및 SYSDATETIMEOFFSET은 산술 식의 일부가 될 수 없습니다.
USE AdventureWorks;
GO
SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635', GETDATE()+ 1)
AS NumberOfDays
FROM Sales.SalesOrderHeader;
GO
USE AdventureWorks;
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 AdventureWorks;
GO
SELECT c.FirstName, c.LastName
,DATEDIFF(day,ROW_NUMBER() OVER (ORDER BY
a.PostalCode),SYSDATETIME()) AS 'Row Number'
FROM Sales.SalesPerson s
INNER JOIN Person.Contact c
ON s.SalesPersonID = c.ContactID
INNER JOIN Person.Address a
ON a.AddressID = c.ContactID
WHERE TerritoryID IS NOT NULL
AND SalesYTD <> 0;
8. startdate에 대한 집계 창 함수 지정
다음 예에서는 집계 창 함수를 startdate 인수로 사용합니다.
USE AdventureWorks;
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