Udostępnij za pośrednictwem


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.

Topic link iconKonwencje składni języka Transact-SQL

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

See Also

Reference