DATEDIFF (Transact-SQL)

Zwraca liczbę (całkowita) określona datepart przekraczające granice między określonym startdate i enddate.

Przegląd wszystkich Transact-SQL data i czas typów danych i funkcji, zobacz Funkcje daty i godziny (Transact-SQL).Informacje i przykłady, które są wspólne dla data i czas typów danych i funkcji, zobacz Data i czas danych.

Ikona łącza do tematuJęzyka Transact-SQL składni konwencje

Składnia

DATEDIFF ( datepart , startdate , enddate )

Argumenty

  • datepart
    Jest to część startdate i enddate , który określa typ granicę przekraczane.W poniższej tabela wymieniono wszystkie prawidłowe datepart argumentów.Odpowiedniki zmienne zdefiniowane przez użytkownika nie są prawidł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
    To wyrażenie , które może być przetłumaczona na time, date, smalldatetime, datetime, datetime2, lub datetimeoffset wartości.datemoże być wyrażenie,wyrażenie kolumna, zmienna zdefiniowane przez użytkownika lub ciąg literału. startdatejest odejmowany od enddate.

    Aby uniknąć niejednoznaczności, za pomocą czterech cyfr.Uzyskać informacje o dwóch cyfr lat Opcja dwie cyfry roku odcięcia.

  • enddate
    Zobacz startdate.

Zwracany typ

int

Wartość zwracana

  • Każdy datepart i jego skróty zwraca te same wartości.

Jeśli wartość zwracana jest spoza zakres dla int (648 +2,147,483,647), zwracany jest błąd.Dla millisecond, maksymalna różnica między startdate i enddate 24 dni, 20 godzin, 31 minut i 23.647 sekund.Dla second, maksymalna różnica polega na lata 68.

Jeśli startdate i enddate zarówno przypisana wartość czas i datepart jest nie czas datepart, zwracane jest 0.

Składnik przesunięcie strefy czas startdate lub endate nie jest używana do obliczania wartości zwracanej.

Ponieważ smalldatetime jest dokładne tylko na minutę, gdy smalldatetime wartość jest używana dla startdate lub enddate, sekundach i milisekundach są zawsze zestaw na 0 w wartości zwracanej.

Jeśli tylko wartość czas jest przypisywana do zmiennej typu danych data , wartość Brak część data jest zestaw na wartość domyślną: 1900-01-01.Jeśli tylko wartość data jest przypisywana do zmiennej typu danych data lub czas , wartość Brak część czas jest zestaw na wartość domyślną: 00:00:00.Jeśli startdate lub enddate tylko część czas i innych tylko część data , Brak czas i części data są zestaw wartości domyślne.

Jeśli startdate i enddate są typy danych inną data i jeden ma więcej czas części lub precision ułamków sekund od drugiej, brakuje części drugiej są zestaw na 0.

DatePart granice

Poniższe instrukcje mają taki sam startdate i tym samym endate.Daty te sąsiadujących i różnią się w czas drugiego.0000001.Różnica między startdate i endate w każdym instrukcja przecięcie jednego kalendarza lub czas granicy jego datepart.Każda instrukcja zwraca wartość 1.Jeśli na przykład używane są różne lata i obie startdate i endate w tym samym tygodniu kalendarzowym wartość zwracana dla week byłoby 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');

Uwagi

DATEDIFF mogą być używane w liście, w przypadku gdy występują, klauzule według kolejności i według grupy.W SQL Server 2008, posługując się miarką DATEDIFF niejawnie kątową literały ciągów ciąg jako datetime2 typów.Korzystając z DATEADD DATEDIFF, należy unikać niejawna poświaty literały ciągów ciąg .Aby uzyskać więcej informacji, zobacz DATEADD (Transact-SQL).

Przykłady

W następujących przykładach użyto różnych typów wyrażeń jako argumentów dla startdate i enddate Parametry.

A.Określanie kolumn data_rozpoczęcia i enddate

Poniższy przykład oblicza liczbę dni granic, które są przekraczane między datami w dwóch kolumnach 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 zdefiniowane przez użytkownika, data_rozpoczęcia i enddate

W poniższym przykładzie użyto zmienne zdefiniowane przez użytkownika jako argumentów dla 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ślaniefunkcje systemowe wartość skalarnadata_rozpoczęcia i enddate

W poniższym przykładzie użytofunkcje systemowe wartość skalarnajako argumentów dla startdate i enddate.

SELECT DATEDIFF(millisecond, GETDATE(), SYSDATETIME());

D.Określanie podkwerend wartość skalarna i funkcji wartość skalarna data_rozpoczęcia i enddate

W poniższym przykładzie użyto podkwerend wartość skalarna i funkcji wartość skalarna jako argumentów dla startdate i enddate.

USE AdventureWorks2008R2;
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 enddate

W poniższym przykładzie użyto stałych znaków jako argumentów dla 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 ifunkcje systemowe dla enddate wartość skalarna

W poniższym przykładzie użyto liczbowe wyrażenie (GETDATE ()+ 1), wartość skalarna funkcje systemowei GETDATE i SYSDATETIME, jako argumentów dla enddate.

Ostrzeżenie

SYSDATETIME, SYSUTCDATETIME i SYSDATETIMEOFFSET nie może być częścią arytmetycznych wyrażenie.

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.Określenie klasyfikacji funkcje data_rozpoczęcia

W poniższym przykładzie użyto funkcja klasyfikacji jako argument dla 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.Określanie okna wartość zagregowana funkcja dla data_rozpoczęcia

W poniższym przykładzie użyto okna funkcja wartość zagregowana jako argument dla 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

Zobacz także

Odwołanie