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.
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