DATEDIFF (Transact-SQL)
Zwraca liczbę (całkowita) na określony datepart granice przekraczane między określonym startdate i enddate.
Aby zapoznać się z omówieniem wszystkich Transact-SQL Data i czas typów danych i funkcji, zobacz Data i godzina, Data typy i funkcje (języka Transact-SQL). Aby uzyskać informacje i przykłady, które są wspólne dla data i czas typów danych i funkcji zobacz Using Date and Time Data.
DATEDIFF ( datepart , startdate , enddate )
Argumenty
datepart
Jest to część startdate i enddate określająca rodzaj granicę przekraczane. Poniższa lista zawiera wszystkie ważne datepart argumenty. Odpowiedniki zmienne zdefiniowane przez użytkownika są nieprawidłowe.datepart
Skróty
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
Is an expression that can be resolved to a time, date, smalldatetime, datetime, datetime2, or datetimeoffset value.date can be an expression, column expression, user-defined variable or string literal.startdate is subtracted from enddate.Aby uniknąć niejednoznaczności, za pomocą czterech cyfr.Aby uzyskać informacje na temat dwóch cyfr lat zobacz two digit year cutoff Option.
enddate
Zobacz startdate.
Zwracany typ
int
Return Value
- Każdy datepart i ich skróty zwracają tę samą wartość.
Jeśli wartość zwracana jest poza zakresem dla int -2 147 483 (648 do +2,147,483,647), zwracany jest błąd. Dla millisecond, maksymalna różnica między startdate i enddate to 24 dni 20 godzin, 31 minut i 23.647 sekund. Dla second, maksymalna różnica wynosi 68 lata.
Jeśli startdate i enddate obie są przypisywane tylko wartość czas oraz datepart nie jest w danej chwili datepart, zwracane jest 0.
A czas składnika przesunięcie strefy startdate lub endate nie jest używana do obliczania wartości zwracanej.
Ponieważ Smalldatetime jest dokładne tylko na minutę, kiedy smalldatetime wartość jest używana startdate lub enddate, sekundach i milisekundach są zawsze zestaw na 0 w wartości zwracanej.
Jeśli tylko czas jest przypisany do zmiennej typu danych Data, wartość Brak część daty jest zestaw na wartość domyślną: 1900-01-01.Jeśli tylko wartości daty jest przypisany do zmiennej typu danych Data lub godzina, brakuje części czas wartość zestaw na wartość domyślną: 00:00:00.Jeśli albo startdate lub enddate część czas i inne części data, braku czas i części data są zestaw do wartości domyślnych.
Jeśli startdate i enddate są różnych typów danych Data, jeden składa się z kilku części czas lub ułamków sekund dokładność niż pozostałe, brakuje części z drugiej strony są ustawione na 0.
Granice w parametrze datepart
Poniższe instrukcje mają taki sam startdate i tym samym endate. Daty te sąsiadujących ze sobą i różnią się w czasie o.0000001 sekundę.Różnica między startdate i endate w każdej instrukcja Przecięcie z jednego kalendarza lub czas krawędzią jego datepart. Każda instrukcja zwraca wartość 1.W przypadku różnych lat w tym przykładzie, a jeśli oba startdate i endate znajdują się w tym samym tygodniu kalendarzowym, wartość zwracana dla week może być równa 0.
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');
Remarks
Tekst DATEDIFF może być używany na liście select, WHERE, HAVING, GROUP BY i ORDER BY klauzule.
Przykłady
W następujących przykładach użyto różnych rodzajów wyrażeń jako argumentów startdate i enddate Parametry.
A.Określanie kolumn data_rozpoczęcia i data_zakończenia
W poniższym przykładzie oblicza liczbę granic dzień, który jest przeskakiwanych między datami w dwóch kolumnach w tabela.
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.Określanie zmienne data_rozpoczęcia i data_zakończenia zdefiniowanej przez użytkownika
W poniższym przykładzie użyto zmienne zdefiniowane przez użytkownika jako argumentów startdate i 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.Określanie wartość skalarna funkcje systemowe data_rozpoczęcia i data_zakończenia
W poniższym przykładzie użyto wartość skalarna funkcje systemowe jako argumentów startdate i enddate.
SELECT DATEDIFF(millisecond, GETDATE(), SYSDATETIME());
D.Określanie podkwerend skalarne i funkcji wartość skalarna data_rozpoczęcia i data_zakończenia
W poniższym przykładzie użyto podkwerend wartość skalarna oraz funkcji wartość skalarna jako argumentów startdate i enddate.
USE AdventureWorks;
GO
SELECT DATEDIFF(day,(SELECT MIN(OrderDate) FROM Sales.SalesOrderHeader),
(SELECT MAX(OrderDate) FROM Sales.SalesOrderHeader));
E.Określanie stałych data_rozpoczęcia i data_zakończenia
W poniższym przykładzie użyto stałych znaków jako argumentów startdate i enddate.
SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635'
, '2007-05-08 09:53:01.0376635');
F.Określanie wyrażeń liczbowych i wartość skalarna funkcje systemowe dla data_zakończenia
W poniższym przykładzie użyto wyrażenie liczbowe (GETDATE ()+ 1)oraz funkcji wartość skalarna systemu GETDATE i SYSDATETIME, jako argumentów enddate.
Uwaga
SYSDATETIME SYSUTCDATETIME i SYSDATETIMEOFFSET nie może być częścią wyrażenie arytmetycznych.
USE AdventureWorks;
GO
SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635', GETDATE()+ 1)
AS NumberOfDays
FROM Sales.SalesOrderHeader;
GO
USE AdventureWorks;
GO
SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635', DATEADD(day,1,SYSDATETIME())) AS NumberOfDays
FROM Sales.SalesOrderHeader;
GO
G.Określanie funkcji klasyfikacji dla data_rozpoczęcia
W poniższym przykładzie użyto funkcja klasyfikacji jako argument dla startdate.
USE AdventureWorks;
GO
SELECT c.FirstName, c.LastName
,DATEDIFF(day,ROW_NUMBER() OVER (ORDER BY
a.PostalCode),SYSDATETIME()) AS 'Row Number'
FROM Sales.SalesPerson s
INNER JOIN Person.Contact c
ON s.SalesPersonID = c.ContactID
INNER JOIN Person.Address a
ON a.AddressID = c.ContactID
WHERE TerritoryID IS NOT NULL
AND SalesYTD <> 0;
H.Określanie funkcja agregacja okna dla data_rozpoczęcia
W poniższym przykładzie użyto funkcja agregacja okno jako argument dla startdate.
USE AdventureWorks;
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