DATEDIFF (Transact-SQL)

Retourne le nombre (entier signé) des limites datepart spécifiées traversées entre les startdate et enddate spécifiées.

Pour obtenir une vue d'ensemble de tous les types de données et fonctions de date et d'heure Transact-SQL, consultez Types de données et fonctions de date et d'heure (Transact-SQL). Pour obtenir des informations et des exemples communs aux types de données et fonctions de date et d'heure, consultez Utilisation des données de date et d'heure.

Icône Lien de rubriqueConventions de syntaxe de Transact-SQL

Syntaxe

DATEDIFF (datepart ,startdate ,enddate )

Arguments

  • datepart
    Partie de startdate et enddate qui spécifie le type de limite traversée. Le tableau suivant répertorie tous les arguments datepart valides. Les équivalents de variables définis par l'utilisateur ne sont pas valides.

    datepart

    Abréviation(s)

    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
    Expression qui peut être résolue en une valeur time, date, smalldatetime, datetime, datetime2 ou datetimeoffset. date peut être une expression, une expression de colonne, une variable définie par l'utilisateur ou un littéral de chaîne. startdate est soustrait de enddate.

    Pour éviter toute ambiguïté, représentez les années à l'aide de quatre chiffres. Pour plus d'informations sur les années à deux chiffres, consultez Option two digit year cutoff.

  • enddate
    Voir startdate.

Type de retour

int

Valeur de retour

  • Chaque datepart et ses abréviations retournent la même valeur.

Si la valeur retournée est hors limites pour int (-2 147 483 648 à +2 147 483 647), une erreur est retournée. Pour millisecond, la différence maximale entre startdate et enddate est de 24 jours, 20 heures, 31 minutes et 23.647 secondes. Pour second, la différence maximale est de 68 ans.

Si une valeur d'heure uniquement est assignée à la fois à startdate et enddate et que la datepart n'est pas une datepart d'heure, 0 est retourné.

Un composant de décalage de fuseau horaire de startdate ou endate n'est pas utilisé pour calculer la valeur retournée.

Dans la mesure où smalldatetime n'offre qu'une précision à la minute, lorsque vous utilisez une valeur smalldatetime pour startdate ou enddate, les secondes et millièmes de seconde ont toujours la valeur 0 dans la valeur retournée.

Si une valeur d'heure uniquement est assignée à une variable d'un type de données date, la valeur de la partie date manquante est égale à la valeur par défaut : 1900-01-01. Si une valeur de date uniquement est assignée à une variable d'un type de données date ou heure, la valeur de la partie heure manquante est égale à la valeur par défaut : 00-00-00. Si startdate ou enddate a uniquement une partie heure et que l'autre a uniquement une partie date, les parties heure et date manquantes sont égales aux valeurs par défaut.

Si startdate et enddate sont de types de données date différents et que l'un a plus de parties heure ou une meilleure précision en fractions de seconde que l'autre, les parties manquantes de l'autre prennent la valeur 0.

Limites de datepart

Les instructions suivantes ont les mêmes startdate et endate. Ces dates sont adjacentes et ont une différence horaire de .0000001 seconde. La différence entre les startdate et endate dans chaque instruction traverse un calendrier ou limite d'heure de son datepart. Chaque instruction retourne 1. Si des années différentes sont utilisées pour cet exemple et que startdate et endate sont toutes deux dans la même semaine de calendrier, la valeur retournée pour week serait 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');

Notes

DATEDIFF peut être utilisé dans la liste de sélection et les clauses WHERE, HAVING, GROUP BY et ORDER BY. Dans SQL Server 2008, DATEDIFF convertit des littéraux de chaîne implicitement comme types datetime2. Lorsque vous utilisez DATEDIFF avec DATEADD, évitez des conversions implicites de littéraux de chaîne. Pour plus d'informations, consultez DATEADD (Transact-SQL).

Exemples

Les exemples suivants utilisent différents types d'expressions comme arguments pour les paramètres startdate et enddate.

A. Spécification de colonnes pour les dates de début et de fin

L'exemple suivant calcule le nombre de limites de jour qui sont traversées entre des dates de deux colonnes dans une table.

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. Spécification de variables définies par l'utilisateur pour les dates de début et de fin

L'exemple suivant utilise des variables définies par l'utilisateur comme arguments pour startdate et 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. Spécification de fonctions système scalaires pour les dates de début et de fin

L'exemple suivant utilise des fonctions système scalaires comme arguments pour startdate et enddate.

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

D. Spécification de sous-requêtes scalaires et de fonctions scalaires pour les dates de début et de fin

L'exemple suivant utilise des sous-requêtes scalaires et des fonctions scalaires comme arguments pour startdate et enddate.

USE AdventureWorks;
GO
SELECT DATEDIFF(day,(SELECT MIN(OrderDate) FROM Sales.SalesOrderHeader),
    (SELECT MAX(OrderDate) FROM Sales.SalesOrderHeader));

A. Spécification de constantes pour les dates de début et de fin

L'exemple suivant utilise des constantes de caractère comme arguments pour startdate et enddate.

SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635'
    , '2007-05-08 09:53:01.0376635');

F. Spécification d'expressions numériques et de fonctions système scalaires pour la date de fin

L'exemple suivant utilise une expression numérique, (GETDATE ()+ 1), et des fonctions système scalaires, GETDATE et SYSDATETIME, comme arguments pour enddate.

[!REMARQUE]

SYSDATETIME, SYSUTCDATETIME et SYSDATETIMEOFFSET ne peuvent pas faire partie d'une expression arithmétique.

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. Spécification de fonctions de classement pour la date de début

L'exemple suivant utilise une fonction de classement comme argument pour 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. Spécification d'une fonction d'agrégation pour la date de début

L'exemple suivant utilise une fonction d'agrégation comme argument pour 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

Voir aussi

Référence