DATEDIFF(Transact-SQL)
지정된 startdate와 enddate 간에 겹쳐지는 지정된 datepart 범위의 수(부호 있는 정수)를 반환합니다.
모든 Transact-SQL 날짜/시간 데이터 형식 및 함수에 대한 개요는 날짜 및 시간 데이터 형식 및 함수(Transact-SQL)를 참조하십시오.
적용 대상: SQL Server(SQL Server 2008 - current version), Windows Azure 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자리 연도에 대한 자세한 내용은 두 자리 연도 구분 서버 구성 옵션 구성을 참조하십시오.
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로 설정되고, 1900-01-01. 시간 또는 날짜 데이터 형식의 변수에 날짜 값만 할당될 경우 누락된 시간 부분의 값은 기본값인 00:00:00으로 설정됩니다. 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 절에서 사용할 수 있습니다.
DATEDIFF는 문자열 리터럴을 datetime2 형식으로 암시적으로 캐스팅합니다. 즉 DATEDIFF는 데이터가 문자열로 전달될 때 형식 YDM을 지원하지 않습니다. YDM 형식을 사용하려면 문자열을 datetime 또는 smalldatetime 형식으로 명시적으로 캐스팅해야 합니다.
SET DATEFIRST를 지정해도 DATEDIFF에는 영향을 주지 않습니다. DATEDIFF는 항상 일요일을 한 주의 첫 날로 사용하여 결정적 함수가 되도록 합니다.
예
다음 예에서는 여러 유형의 식을 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 AdventureWorks2012;
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 AdventureWorks2012;
GO
SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635', GETDATE()+ 1)
AS NumberOfDays
FROM Sales.SalesOrderHeader;
GO
USE AdventureWorks2012;
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 AdventureWorks2012;
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 AdventureWorks2012;
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