Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
Azure Synapse Analytics
Analytics Platform Sistemi (PDW)
Microsoft Fabric'te SQL Veritabanı
Bu fonksiyon, belirtilen başlangıç tarihi ile bitiş tarihi arasında geçilen belirtilen tarih parçası sınırlarının sayısını (işaretli tam sayı değeri olarak) döndürür.
Başlangıç tarihi ve bitiş tarihi değerleri arasındaki daha büyük farkları ele alan bir fonksiyon için DATEDIFF_BIG'e bakınız. Tüm Transact-SQL tarih ve saat veri türlerine ve işlevlerine genel bakış için bkz. Tarih ve saat veri türleri ve işlevleri.
Transact-SQL söz dizimi kuralları
Sözdizimi
DATEDIFF ( datepart , startdate , enddate )
Arguments
datepart
DATEDIFF tarihi ile bitiş tarihi arasındaki farkı bildiren birimleri belirtir. Yaygın olarak kullanılan tarih bölümü birimleri veya monthiçerirsecond.
Datepart değeri değişkende veya tırnak şeklinde belirtilemez.'month'
Aşağıdaki tablo tüm geçerli datepart değerlerini listeler.
DATEDIFF tarih parçasının tam adını veya tam ismin herhangi bir kısaltmasını kabul eder.
| tarih bölümü adı | datepart kısaltması |
|---|---|
year |
yy, yyyy |
quarter |
qq, q |
month |
mm, m |
dayofyear |
dy, y |
day |
dd, d |
week |
wk, ww |
weekday |
dw, w |
hour |
hh |
minute |
mi, n |
second |
ss, s |
millisecond |
ms |
microsecond |
mcs |
nanosecond |
ns |
Her belirli datepart adı ve o datepart adının kısaltmaları aynı değeri verir.
başlangıç tarihi
Aşağıdaki değerlerden birine çözümlenebilen bir ifade:
- date
- datetime
- datetimeoffset
- datetime2
- smalldatetime
- time
Belirsizlikten kaçınmak için dört haneli yıllar kullanın. İki haneli yıl değerleri hakkında bilgi için Server configuration: iki haneli yıl kesme noktasına bakınız.
bitiş tarihi
Bkz. başlangıç tarihi.
Dönüş türleri
int
Dönüş değeri
Başlangıç tarihi ile bitiş tarihi arasındaki int farkı, datepart tarafından belirlenen sınırda ifade edilir.
Örneğin, SELECT DATEDIFF(day, '2036-03-01', '2036-02-28'); duruş -2, 2036'nın bir sıçrama yılı olması gerektiğine işaret eder. Bu durum, başlangıç tarihinden2036-03-01 başlayıp günleri sayarsak -2 , bitiş tarihine2036-02-28ulaştığımız anlamına gelir.
Zekâ için aralık dışı bir getiri değeri (-2,147,483,648 ile +2,147,483,647) için DATEDIFF hata döner. Için millisecondise başlangıç tarihi ile bitiş tarihi arasındaki maksimum fark 24 gün, 20 saat, 31 dakika ve 23.647 saniyedir. Için secondmaksimum fark 68 yıl, 19 gün, 3 saat, 14 dakika ve 7 saniyedir.
Eğer başlangıç tarihi ve bitiş tarihi sadece bir zaman değeri atanmışsa ve tarih parçası zaman tarihi değilse, DATEDIFF0döner.
DATEDIFF Dönüş değerini hesaplamak için başlangıç tarihi veya bitiş tarihinin zaman kuşağı ofset bileşenini kullanır.
Smalldatetime sadece dakikaya kadar doğru olduğundan, 0 veya bitiş tarihismalldatetime değerine sahip olduğunda geri dönüş değerinde saniyeler ve milisaniyeler her zaman ayarlanır.
Bir tarih veri türü değişkenine yalnızca bir saat değeri atanmışsa, DATEDIFF eksik tarih bölümünün değerini varsayılan değere ayarlar: 1900-01-01. Saat veya tarih veri türündeki bir değişkene yalnızca bir tarih değeri atanmışsa, DATEDIFF eksik saat bölümünün değerini varsayılan değere ayarlar: 00:00:00.
Başlangıç tarihi veya bitiş tarihi yalnızca bir saat bölümüne, diğerinde ise yalnızca tarih bölümüne sahipse, DATEDIFF eksik saat ve tarih bölümlerini varsayılan değerlere ayarlar.
Eğer başlangıç tarihi ve bitiş tarihi farklı tarih veri türlerine sahipse ve biri diğerinden daha fazla zaman parçası veya kısmal saniye hassasiyetine sahipse, DATEDIFF diğerinin eksik parçalarını .0
Datepart sınırları
Aşağıdaki deyimler aynı başlangıç tarihi ve aynı bitiş tarihi değerlerine sahiptir. Bu tarihler bitişik ve zaman olarak yüz nanosaniye (.0000001 saniye) fark eder. Her deyimdeki başlangıç tarihi ile bitiş tarihi arasındaki fark, datepart'ın bir takvim veya saat sınırını geçer. Her ifade döndürür 1.
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(weekday, '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');
SELECT DATEDIFF(microsecond, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
Başlangıç tarihi ve bitiş tarihi farklı yıl değerlerine sahipse ama aynı takvim haftası değerlerine sahipse, DATEDIFF0 için dönerweek.
Açıklamalar
, , , , ve DATEDIFF cümlelerinde SELECT <list>kullanılırWHERE. HAVINGGROUP BYORDER BY
DATEDIFF Dize değişmez değerlerini örtük olarak datetime2 türü olarak dönüştürür. Yani, DATEDIFF tarih bir dizi olarak geçildiğinde formatı YDM desteklemez. Formatı kullanmak için diziyi açıkça bir datetime veya YDM tipine dökmelisiniz.
Belirtmenin SET DATEFIRST üzerinde DATEDIFFhiçbir etkisi yoktur.
DATEDIFF işlevin belirleyici bir şekilde çalıştığından emin olmak için her zaman haftanın ilk günü olarak Pazar'ı kullanır.
DATEDIFFBitiş tarihi ile minute arasındaki fark int aralığının dışında bir değer döndürürse, hassasiyet veya daha yüksek bir hassasiyetle taşabilir.
Örnekler
Bu makaledeki kod örnekleri, AdventureWorks2025 giriş sayfasından indirebileceğiniz AdventureWorksDW2025 veya örnek veritabanını kullanır.
Bu örnekler, başlangıç tarihi ve bitiş tarihi parametreleri için farklı tür ifadeler argümanı olarak kullanır.
A. Başlangıç tarihi ve bitiş tarihi için sütunlar belirtin
Bu örnek, tarihler arasında geçen gün sınırlarının sayısını bir tabloda iki sütunda hesaplar.
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;
Sonuç kümesi aşağıdadır.
Duration
--------
1
B. Başlangıç tarihi ve bitiş tarihi için kullanıcı tanımlı değişkenler belirtin
Bu örnekte, kullanıcı tanımlı değişkenler başlangıç tarihi ve bitiş tarihi için argüman olarak hizmet verir.
DECLARE @startdate AS DATETIME2 = '2007-05-05 12:10:09.3312722';
DECLARE @enddate AS DATETIME2 = '2007-05-04 12:10:09.3312722';
SELECT DATEDIFF(day, @startdate, @enddate);
C. Başlangıç tarihi ve bitiş tarihi için skaler sistem fonksiyonlarını belirt
Bu örnek, başlangıç tarihi ve bitiş tarihi için argüman olarak skaler sistem fonksiyonlarını kullanır.
SELECT DATEDIFF(millisecond, GETDATE(), SYSDATETIME());
D. Başlangıç tarihi ve bitiş tarihi için skaler alt sorgular ve skaler fonksiyonlar belirtin
Bu örnek, başlangıç ve bitiş tarihi için argüman olarak skaler alt sorgular ve skaler fonksiyonlar kullanır.
USE AdventureWorks2022;
GO
SELECT DATEDIFF(day, (SELECT MIN(OrderDate)
FROM Sales.SalesOrderHeader), (SELECT MAX(OrderDate)
FROM Sales.SalesOrderHeader));
E. Başlangıç tarihi ve bitiş tarihi için sabitler belirtin
Bu örnek, başlangıç ve bitiş tarihi için karakter sabitlerini argüman olarak kullanır.
SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635', '2007-05-08 09:53:01.0376635');
F. Bitiş tarihi için sayısal ifadeler ve skaler sistem fonksiyonları belirtin
Bu örnek, son (GETDATE() + 1) için argüman olarak sayısal GETDATEbir ifade ve skaler sistem SYSDATETIME fonksiyonları ve , kullanır.
USE AdventureWorks2022;
GO
SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635', GETDATE() + 1) AS NumberOfDays
FROM Sales.SalesOrderHeader;
GO
USE AdventureWorks2022;
GO
SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635', DATEADD(day, 1, SYSDATETIME())) AS NumberOfDays
FROM Sales.SalesOrderHeader;
GO
G. Başlama tarihi için sıralama fonksiyonlarını belirt
Bu örnek, startdate için bir argüman olarak bir sıralama fonksiyonu kullanır.
USE AdventureWorks2022;
GO
SELECT p.FirstName,
p.LastName,
DATEDIFF(day, ROW_NUMBER() OVER (ORDER BY a.PostalCode), SYSDATETIME()) AS 'Row Number'
FROM Sales.SalesPerson AS s
INNER JOIN Person.Person AS p
ON s.BusinessEntityID = p.BusinessEntityID
INNER JOIN Person.Address AS a
ON a.AddressID = p.BusinessEntityID
WHERE TerritoryID IS NOT NULL
AND SalesYTD <> 0;
H. Başlatma tarihi için bir toplu pencere fonksiyonu belirtin
Bu örnek, başlangıç tarihi için bir argüman olarak bir toplam pencere fonksiyonu kullanır.
USE AdventureWorks2022;
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 AS sod
INNER JOIN Sales.SalesOrderHeader AS soh
ON sod.SalesOrderID = soh.SalesOrderID
WHERE soh.SalesOrderID IN (43659, 58918);
GO
I. Başlama tarihi ile bitiş tarihi arasındaki farkı tarih parça dizileri olarak bulun
-- DOES NOT ACCOUNT FOR LEAP YEARS
DECLARE @date1 AS DATETIME, @date2 AS DATETIME, @result AS VARCHAR (100);
DECLARE @years AS INT, @months AS INT, @days AS INT, @hours AS INT, @minutes AS INT, @seconds AS INT, @milliseconds AS INT;
SET @date1 = '1900-01-01 00:00:00.000';
SET @date2 = '2018-12-12 07:08:01.123';
SELECT @years = DATEDIFF(yy, @date1, @date2);
IF DATEADD(yy, -@years, @date2) < @date1
SELECT @years = @years - 1;
SET @date2 = DATEADD(yy, -@years, @date2);
SELECT @months = DATEDIFF(mm, @date1, @date2);
IF DATEADD(mm, -@months, @date2) < @date1
SELECT @months = @months - 1;
SET @date2 = DATEADD(mm, -@months, @date2);
SELECT @days = DATEDIFF(dd, @date1, @date2);
IF DATEADD(dd, -@days, @date2) < @date1
SELECT @days = @days - 1;
SET @date2 = DATEADD(dd, -@days, @date2);
SELECT @hours = DATEDIFF(hh, @date1, @date2);
IF DATEADD(hh, -@hours, @date2) < @date1
SELECT @hours = @hours - 1;
SET @date2 = DATEADD(hh, -@hours, @date2);
SELECT @minutes = DATEDIFF(mi, @date1, @date2);
IF DATEADD(mi, -@minutes, @date2) < @date1
SELECT @minutes = @minutes - 1;
SET @date2 = DATEADD(mi, -@minutes, @date2);
SELECT @seconds = DATEDIFF(s, @date1, @date2);
IF DATEADD(s, -@seconds, @date2) < @date1
SELECT @seconds = @seconds - 1;
SET @date2 = DATEADD(s, -@seconds, @date2);
SELECT @milliseconds = DATEDIFF(ms, @date1, @date2);
SELECT @result = ISNULL(CAST (NULLIF (@years, 0) AS VARCHAR (10)) + ' years,', '')
+ ISNULL(' ' + CAST (NULLIF (@months, 0) AS VARCHAR (10)) + ' months,', '')
+ ISNULL(' ' + CAST (NULLIF (@days, 0) AS VARCHAR (10)) + ' days,', '')
+ ISNULL(' ' + CAST (NULLIF (@hours, 0) AS VARCHAR (10)) + ' hours,', '')
+ ISNULL(' ' + CAST (@minutes AS VARCHAR (10)) + ' minutes and', '')
+ ISNULL(' ' + CAST (@seconds AS VARCHAR (10)) + CASE
WHEN @milliseconds > 0
THEN '.' + CAST (@milliseconds AS VARCHAR (10))
ELSE ''
END + ' seconds', '');
SELECT @result;
Sonuç kümesi aşağıdadır.
118 years, 11 months, 11 days, 7 hours, 8 minutes and 1.123 seconds
Örnekler: Azure Synapse Analytics ve Analytics Platform Sistemi (PDW)
Bu örnekler, başlangıç tarihi ve bitiş tarihi parametreleri için farklı tür ifadeler argümanı olarak kullanır.
J. Başlangıç tarihi ve bitiş tarihi için sütunlar belirtin
Bu örnek, tarihler arasında geçen gün sınırlarının sayısını bir tabloda iki sütunda hesaplar.
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 TOP (1) DATEDIFF(day, startDate, endDate) AS [Duration]
FROM dbo.Duration;
Duration
--------
1
K. Başlangıç tarihi ve bitiş tarihi için skaler alt sorgular ve skaler fonksiyonlar belirtin
Bu örnek, başlangıç ve bitiş tarihi için argüman olarak skaler alt sorgular ve skaler fonksiyonlar kullanır.
-- Uses AdventureWorks
SELECT TOP (1) DATEDIFF(day, (SELECT MIN(HireDate)
FROM dbo.DimEmployee), (SELECT MAX(HireDate)
FROM dbo.DimEmployee))
FROM dbo.DimEmployee;
L. Başlangıç tarihi ve bitiş tarihi için sabitler belirtin
Bu örnek, başlangıç ve bitiş tarihi için karakter sabitlerini argüman olarak kullanır.
-- Uses AdventureWorks
SELECT TOP (1) DATEDIFF(day, '2007-05-07 09:53:01.0376635', '2007-05-08 09:53:01.0376635')
FROM DimCustomer;
M. Başlama tarihi için sıralama fonksiyonlarını belirt
Bu örnek, startdate için bir argüman olarak bir sıralama fonksiyonu kullanır.
-- Uses AdventureWorks
SELECT FirstName,
LastName,
DATEDIFF(day, ROW_NUMBER() OVER (ORDER BY DepartmentName), SYSDATETIME()) AS RowNumber
FROM dbo.DimEmployee;
N. Başlatma tarihi için bir toplu pencere fonksiyonu belirtin
Bu örnek, başlangıç tarihi için bir argüman olarak bir toplam pencere fonksiyonu kullanır.
-- Uses AdventureWorks
SELECT FirstName,
LastName,
DepartmentName,
DATEDIFF(year, MAX(HireDate) OVER (PARTITION BY DepartmentName), SYSDATETIME()) AS SomeValue
FROM dbo.DimEmployee;