DATEDIFF (Transact-SQL)
Sayısı (imzalı tamsayı) belirtilen verir datepart sınırları çapraz arasında belirtilen startdate ve enddate.
Tüm genel bakış için Transact-SQLBkz:tarih ve saat veri türleri ve İşlevler, Tarih ve Saat İşlevleri (Transact-SQL).Bilgi ve tarih ve saat veri türleri ve işlevleri ortaktır örnekler için bkz: Tarih ve saat veri kullanma.
Sözdizimi
DATEDIFF ( datepart , startdate , enddate )
Bağımsız değişkenler
datepart
Parçası olan startdate ve enddate Çapraz sınır türünü belirtir.Aşağıdaki tablo geçerli listeler datepart bağımsız değişkeni.Kullanıcı tanımlı değişken eşdeğerleri 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
İçin çözümlenebilir bir ifade bir time, date, smalldatetime, datetime, datetime2, veya datetimeoffset değer.datebir ifade, sütun ifade, kullanıcı tanımlı bir değişken veya dize hazır bilgi olabilir.startdatedan çıkarılır enddate.Belirsizlik önlemek için dört basamaklı yıl kullanın.İki basamaklı yılları hakkında daha fazla bilgi için bkz: iki basamaklı yıl kesme seçeneği.
enddate
Bkz. startdate.
Dönüş Türü
int
Dönüş Değeri
- Her datepart ve kendi kısaltmaları aynı değeri.
Dönüş değeri için aralık dışında olup int +2,147,483,647 için (2.147.483.648), bir hata döndürdü.İçin millisecond, arasındaki en büyük fark startdate ve enddate olan 24 gün, 20 saat, 31 dakika ve 23.647 saniye.İçin second, en büyük fark ise 68 yıl.
startdate Ve enddate her ikisi de yalnızca bir saat değeri atanır ve datepart saatdeğil bir datepart, 0 döner.
Bir saat dilimi uzaklığı bileşeni olan startdate veya endate Hesaplama içinde kullanılmazdönüş değeri.
Çünkü smalldatetime dakika için yalnızca doğru olduğunda bir smalldatetime değeri için kullanılan startdate veya enddate, saniye ve milisaniye olarak her zaman küme 0 dönüş değeri.
Yalnızca bir saat değer veri türü tarih değişkenine atanır, eksik tarih bölümünü küme için varsayılan değer değeridir: 1900-01-01.Yalnızca bir saat ya da tarih veri türünde bir değişken için bir tarih değeri atanır, eksik saat bölümünü küme için varsayılan değer değeridir: 00:00:00.Ya da, startdate veya enddate sahip yalnızca saat bölümünü ve diğer yalnızca tarih bölümünü eksik saat ve tarih bölümleri küme için varsayılan değerler.
startdate Ve enddate farklı tarih veri türleri olan ve bir daha fazla saat parçaları veya Kesirli saniye duyarlık diğerinden sahiptir, diğer eksik parçalarını küme için 0.
DatePart sınırları
Aþaðýdaki ifadeleri aynı olduğu startdate ve aynı endate.Bu tarih, bitişik olan ve.0000001 saniye saat farklıdır.Arasındaki fark startdate ve endate her deyim , bir takvim veya saat sınırını geçiyor, datepart.Her deyim 1 döndürür.Bu örnek için kullanılan farklı yıl ve iki startdate ve endate aynı takvim hafta, dönüş değeri olan week 0 olacaktır.
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 seçme listesinde kullanılabilir nerede, HAVING, by ve order by yan tümceleri GRUPLANDIRMAK.De SQL Server 2008, DATEDIFF örtülü olarak çevirir ve dize hazır olarak datetime2 türleri.DATEDIFF dateadd ile kullanırken, düz dize kümesinde örtülü yayınları kaçının.Daha fazla bilgi için, bkz. DATEADD (Transact-SQL).
Örnekler
Aşağıdaki örnekler, farklı türde ifadeler bağımsız değişkenleri olarak kullanmak startdate ve enddate parametreleri.
A.Sütunlar başlangıçtarihi ve bitiştarihi için belirtme
Aşağıdaki örnek, bir tabloiki sütundaki tarihleri arasında çapraz gün sınırları sayısını 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;
-- Returns: 1
B.Kullanıcı tanımlı değişkenleri başlangıçtarihi ve bitiştarihi için belirtme
Aşağıdaki örnek, kullanıcı tanımlı değişkenleri için bağımsız değişkenler olarak kullanır startdate ve 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.skalersistem işlevleri başlangıçtarihi ve bitiştarihi için belirtme
Aşağıdaki örnek skaler sistem işlevleri bağımsız değişkenleri kullanır startdate ve enddate.
SELECT DATEDIFF(millisecond, GETDATE(), SYSDATETIME());
D.skaler alt sorgular ve skaler işlevleri başlangıçtarihi ve bitiştarihi için belirtme
Aşağıdaki örnek skaler alt sorgular ve skaler işlevleri için bağımsız değişken olarak kullanır startdate ve enddate.
USE AdventureWorks2008R2;
GO
SELECT DATEDIFF(day,(SELECT MIN(OrderDate) FROM Sales.SalesOrderHeader),
(SELECT MAX(OrderDate) FROM Sales.SalesOrderHeader));
E.Sabitleri başlangıçtarihi ve bitiştarihi için belirtme
Aşağıdaki örnek, karakter sabitler için bağımsız değişken olarak kullanır startdate ve enddate.
SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635'
, '2007-05-08 09:53:01.0376635');
F.Sayısal ifadeleri ve bitiştarihi skaler sistem işlevleri belirtme
Aşağıdaki örnek sayısal ifadekullanan (GETDATE ()+ 1)ve skaler sistem işlevleri, GETDATE ve SYSDATETIME, bağımsız olarak enddate.
Not
SYSDATETIME, SYSUTCDATETIME ve SYSDATETIMEOFFSET bir aritmetik ifadeparçası olamaz.
USE AdventureWorks2008R2;
GO
SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635', GETDATE()+ 1)
AS NumberOfDays
FROM Sales.SalesOrderHeader;
GO
USE AdventureWorks2008R2;
GO
SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635', DATEADD(day,1,SYSDATETIME())) AS NumberOfDays
FROM Sales.SalesOrderHeader;
GO
G.Sıralama işlevleri başlangıçtarihi için belirtme
Aşağıdaki örnek, bir sıralama işlev için bağımsız değişken olarak kullanır startdate.
USE AdventureWorks2008R2;
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.Bir toplu penceresi işlev başlangıçtarihi için belirtme
Aşağıdaki örnek bir toplu penceresi işlev için bir bağımsız değişken olarak kullanır. startdate.
USE AdventureWorks2008R2;
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