Makaleyi İngilizce dilinde görüntülemek için İngilizce onay kutusunu işaretleyin. Ayrıca, fare işaretçisiyle İngilizce metnin üzerine gelerek metni açılır pencerede de görüntüleyebilirsiniz.
Çeviri
İngilizce

DATEDIFF (Transact-SQL)

SQL Server 2012

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).

Konu bağlantısı simgesi Transact-SQL Sözdizim Kuralları


DATEDIFF ( datepart , startdate , enddate )

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.

  • 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.

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');

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.

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

Topluluk İçeriği

Ekle
Show: