Aracılığıyla paylaş


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

Konu bağlantısı simgesi 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

Ayrıca bkz.

Başvuru

CAST ve CONVERT (Transact-SQL)