Transact-SQL Reference


To jest tekst przetłumaczony maszynowo.
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.

NoteNote:

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

Page view tracker