DATEDIFF (Transact-SQL)
Belirtilen startdate ve enddate arasında aşılan belirtilen datepart sınırlarının sayısını (işaretli tamsayı) döndürür.
Tüm Transact-SQL tarih ve saat veri türleri ve işlevlerine genel bir bakış için, bkz. Tarih ve Saat veri türleri ve işlevler (Transact-sql).
Transact-SQL Sözdizim Kuralları
Sözdizimi
DATEDIFF ( datepart , startdate , enddate )
Bağımsız değişkenler
datepart
startdate ve enddate değerlerinin aşılan sınır türünü belirten kısmıdır. Aşağıdaki tablo tüm geçerli datepart değişkenlerini listelemektedir. Kullanıcı tanımlı değişken karşılıkları geçerli değildir.datepart
Kısaltmalar
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
Bir time, date, smalldatetime, datetime, datetime2 veya datetimeoffset değerine çözülebilen bir ifadedir. date bir ifade, bir sütun ifadesi, kullanıcı tanımlı bir değişken veya bir dize hazır değeri olabilir. startdate değeri enddate değerinden çıkarılır.Belirsizlikten kaçınmak için dört rakamlı yıllar kullanın. İki rakamlı yıllar hakkında daha fazla bilgi için, bkz. Yapılandırma iki basamaklı yıl kesme sunucu yapılandırma seçeneği.
enddate
Bkz. startdate.
Dönüş Türü
int
Dönüş Değeri
- Her datepart ve kısaltmaları aynı değeri döndürür.
Döndürülen değer int türü aralığının (-2.147.483.648 - +2.147.483.647) dışında kalıyorsa, bir hata döndürülür. millisecond için startdate ile enddate arasındaki en büyük fark 24 gün, 20 saat, 31 dakika ve 23,647 saniyedir. second için en büyük fark 68 yıldır.
startdate ve enddate değerlerinin her ikisine de yalnızca saat değeri atanmışsa ve datepart bir saat datepart değeri değilse, 0 döndürülür.
Döndürülen değer hesaplanırken startdate veya endate değerleri için bir saat dilimi uzaklığı bileşeni kullanılmaz.
smalldatetime yalnızca dakika düzeyinde kesinliğe sahip olduğundan startdate veya enddate için bir smalldatetime değeri kullanıldığında, döndürülen değerde saniye ve milisaniyeler her zaman 0'a ayarlanır.
Tarih veri türünde bir değişkene yalnızca bir saat değeri atanırsa, eksik tarih kısmının değeri varsayılan değere ayarlanır: 1900-01-01. Saat veya tarih veri türünde bir değişkene yalnızca bir tarih değeri atanırsa, eksik saat kısmının değeri varsayılan değere ayarlanır: 00-00-00. startdate veya enddate değerlerinden biri yalnızca bir saat kısmına, diğeri ise yalnızca bir tarih kısmına sahipse, eksik saat ve tarih kısımları varsayılan değerlere ayarlanır.
startdate ve enddate farklı tarih veri türlerindeyse ve birinin diğerinden daha fazla saat kısmı veya kesirli saniye kesinliği varsa, diğerinde eksik olan kısım 0'a ayarlanır.
datepart Sınırları
Aşağıdaki deyimler aynı startdate ve endate değerlerine sahiptir. Bu tarihler bitişiktir ve aralarında .0000001 saniyelik bir fark vardır. Her deyimdeki startdate ve endate arasındaki fark, datepart değerinin bir takvim veya saat sınırını aşar. Her deyim 1 döndürür. Bu örnek için farklı için yıllar kullanılır ve hem startdate hem de endate aynı takvim haftasında olursa, week için döndürülen değer 0 olur.
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');
Açıklamalar
DATEDIFF işlevi SELECT listesinde, WHERE, HAVING, GROUP BY ve ORDER BY yan tümcelerinde kullanılabilir.
SQL Server 2012'da DATEDIFF, dize hazır değerlerini örtülü olarak bir datetime2 türüne çevirir. Bu, tarih bir dize olarak geçildiğinde DATEDIFF'in YDM biçimini desteklemediği anlamına gelir. YDM biçimini kullanmak için dizeyi açıkça bir datetime veya smalldatetime türüne çevirmeniz gerekir.
Örnekler
Aşağıdaki örnekler startdate ve enddate parametreleri için değişken olarak farklı tür ifadeler kullanmaktadır.
A.startdate ve enddate için sütunlar belirtme
Aşağıdaki örnek bir tablodaki iki sütunda tarihler arasında aşılan gün sayısı sınırlarını hesaplamaktadır.
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
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
B.startdate ve enddate için kullanıcı tanımlı değişkenleri belirtme
Aşağıdaki örnek kullanıcı tanımlı değişkenleri startdate ve enddate için değişken olarak kullanmaktadır.
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);
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);
C.startdate ve enddate için skaler sistem işlevleri belirtme
Aşağıdaki örnek skaler sistem işlevlerini startdate ve enddate için değişkenler olarak kullanmaktadır.
SELECT DATEDIFF(millisecond, GETDATE(), SYSDATETIME());
SELECT DATEDIFF(millisecond, GETDATE(), SYSDATETIME());
D.startdate ve enddate için skaler alt sorgular ve skaler işlevler belirtme
Aşağıdaki örnek skaler alt sorguları ve skaler işlevleri startdate ve enddate için değişken olarak kullanmaktadır.
USE AdventureWorks2012;
GO
SELECT DATEDIFF(day,(SELECT MIN(OrderDate) FROM Sales.SalesOrderHeader),
(SELECT MAX(OrderDate) FROM Sales.SalesOrderHeader));
USE AdventureWorks2012;
GO
SELECT DATEDIFF(day,(SELECT MIN(OrderDate) FROM Sales.SalesOrderHeader),
(SELECT MAX(OrderDate) FROM Sales.SalesOrderHeader));
E.startdate ve enddate için sabitler belirtme
Aşağıdaki örnek, startdate ve enddate için karakter sabitleri kullanmaktadır.
SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635'
, '2007-05-08 09:53:01.0376635');
SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635'
, '2007-05-08 09:53:01.0376635');
F.enddate için sayısal işlevler ve skaler sistem işlevleri belirtme
Aşağıdaki örnek, enddate için bağımsız değişken olarak (GETDATE ()+ 1) sayısal ifadesini ve GETDATE ve SYSDATETIME skaler sistem işlevlerini kullanmaktadır.
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
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
G.startdate olarak derecelendirme işlevlerini belirtme
Aşağıdaki örnek bir derecelendirme işlevini startdate için bağımsız değişken olarak kullanmaktadır.
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;
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;
H.startdate için toplu bir pencere işlevi belirtme
Aşağıdaki örnek toplu bir pencere işlevini startdate için bir değişken olarak kullanmaktadır.
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
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