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');
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.
Note: |
|---|
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