DATEDIFF_BIG (Transact-SQL)
S’applique à : SQL Server 2016 (13.x) et versions ultérieures Azure SQL Database Azure SQL Managed Instance
Cette fonction retourne le nombre (valeur entière très grande signée) de limites datepart spécifiées, traversées entre les valeurs startdate et enddate spécifiées.
Pour obtenir une vue d’ensemble de tous les types de données et toutes les fonctions de date et d’heure Transact-SQL, consultez Types de données et fonctions de date et d’heure (Transact-SQL).
Conventions de la syntaxe Transact-SQL
Syntaxe
DATEDIFF_BIG ( datepart , startdate , enddate )
Arguments
datepart
Partie de startdate et enddate qui spécifie le type de limite traversée.
Notes
DATEDIFF_BIG
n’accepte pas les valeurs datepart de variables définies par l’utilisateur ou comme chaînes entre guillemets.
Ce tableau liste l’ensemble des noms et des abréviations datepart valides.
Nom datepart | Abréviation datepart |
---|---|
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 |
Notes
Chaque nom datepart spécifique et les abréviations pour ce nom datepart retournent la même valeur.
startdate
Expression qui peut être résolue en valeur, parmi les suivantes :
- date
- datetime
- datetimeoffset
- datetime2
- smalldatetime
- time
Pour date, DATEDIFF_BIG
accepte une expression de colonne, une expression, un littéral de chaîne ou une variable définie par l’utilisateur. Une valeur de littéral de chaîne doit être résolue en datetime. Pour éviter toute ambiguïté, utilisez des années à quatre chiffres. DATEDIFF_BIG
soustrait startdate de enddate. Pour éviter toute ambiguïté, représentez les années à l'aide de quatre chiffres. Pour obtenir des informations sur les années à deux chiffres, consultez Configurer l’option de configuration du serveur two digit year cutoff.
enddate
Consultez startdate.
Type de retour
bigint signé
Valeur de retour
Retourne la différence bigint entre startdate et enddate, exprimée dans le jeu de limites par datepart.
Si une valeur de retour est hors limites pour bigint (-9 223 372 036 854 775 808 à +9 223 372 036 854 775 807), DATEDIFF_BIG
retourne une erreur. Contrairement à DATEDIFF, qui retourne un int et qui par conséquent, peut dépasser la capacité d’une minute ou plus, DATEDIFF_BIG
peut dépasser la capacité seulement si vous utilisez une précision d’une nanoseconde, où la différence entre enddate et startdate est supérieure à 292 années, 3 mois, 10 jours, 23 heures, 47 minutes et 16,8547758 secondes.
Si startdate et enddate se voient tous les deux assigner uniquement une valeur d’heure et que datepart n’est pas un datepart d’heure, DATEDIFF_BIG
retourne 0.
DATEDIFF_BIG
n’utilise pas un composant de décalage de fuseau horaire de startdate ou enddate pour calculer la valeur de retour.
Quand vous utilisez une valeur smalldatetime pour startdate ou enddate, DATEDIFF_BIG
définit toujours les secondes et millisecondes avec la valeur 0 dans la valeur de retour dans la mesure où smalldatetime n’offre qu’une précision à la minute.
Si seule une valeur d’heure est affectée à une variable d’un type de données date, DATEDIFF_BIG
définit la partie date manquante sur la valeur par défaut :1900-01-01
. Si seule une valeur de date est affectée à une variable d’un type de données date ou heure, DATEDIFF_BIG
définit la partie heure manquante sur 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, DATEDIFF_BIG
affecte aux parties heure et date manquantes les valeurs par défaut.
Si startdate et enddate ont des 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, DATEDIFF_BIG
affecte aux parties manquantes de l’autre la valeur 0.
Limites de datepart
Les instructions suivantes ont les mêmes valeurs startdate et enddate. Ces dates sont adjacentes et ont une différence d’une centaine de nanosecondes (0,0000001 seconde). La différence entre les startdate et endate dans chaque instruction traverse une limite d’heure ou de calendrier de son datepart. Chaque instruction retourne 1. Si startdate et enddate ont des valeurs d’année différentes, mais les mêmes valeurs de semaine de calendrier, DATEDIFF_BIG
retourne 0 pour datepart week.
SELECT DATEDIFF_BIG(year, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(quarter, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(month, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(dayofyear, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(day, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(week, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(hour, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(minute, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(second, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(millisecond, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
Notes
Utilisez DATEDIFF_BIG
dans les clauses SELECT <list>
, WHERE
, HAVING
, GROUP BY
et ORDER BY
.
DATEDIFF_BIG
caste implicitement les littéraux de chaîne en type datetime2. Cela signifie que DATEDIFF_BIG
ne prend pas en charge le format YDM lorsque la date est passée comme une chaîne. Vous devez caster explicitement la chaîne en type datetime ou smalldatetime pour utiliser le format AJM.
La spécification de SET DATEFIRST
n’a pas d’effet sur DATEDIFF_BIG
. DATEDIFF_BIG
utilise toujours Dimanche comme premier jour de la semaine pour que la fonction soit déterministe.
DATEDIFF_BIG
peut dépasser la capacité d’une nanoseconde ou plus si la différence entre enddate et startdate retourne une valeur qui est hors limites pour bigint.
Exemples
Spécification de colonnes pour les dates de début et de fin
Cet exemple utilise différents types d’expressions comme arguments pour les paramètres startdate et enddate. Il calcule le nombre de limites de jour qui sont traversées entre les dates de deux colonnes d’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_BIG(day, startDate, endDate) AS 'Duration'
FROM dbo.Duration;
-- Returns: 1
Recherche de la différence entre des dates startdate et enddate sous forme de chaînes de parties de date
DECLARE @date1 DATETIME2, @date2 DATETIME2, @result VARCHAR(100)
DECLARE @years BIGINT, @months BIGINT, @days BIGINT, @hours BIGINT, @minutes BIGINT, @seconds BIGINT, @milliseconds BIGINT
SET @date1 = '0001-01-01 00:00:00.00000000'
SET @date2 = '2018-12-12 07:08:01.12345678'
SELECT @years = DATEDIFF(yy, @date1, @date2)
IF DATEADD(yy, -@years, @date2) < @date1
SELECT @years = @years-1
SET @date2 = DATEADD(yy, -@years, @date2)
SELECT @months = DATEDIFF(mm, @date1, @date2)
IF DATEADD(mm, -@months, @date2) < @date1
SELECT @months=@months-1
SET @date2= DATEADD(mm, -@months, @date2)
SELECT @days=DATEDIFF(dd, @date1, @date2)
IF DATEADD(dd, -@days, @date2) < @date1
SELECT @days=@days-1
SET @date2= DATEADD(dd, -@days, @date2)
SELECT @hours=DATEDIFF(hh, @date1, @date2)
IF DATEADD(hh, -@hours, @date2) < @date1
SELECT @hours=@hours-1
SET @date2= DATEADD(hh, -@hours, @date2)
SELECT @minutes=DATEDIFF(mi, @date1, @date2)
IF DATEADD(mi, -@minutes, @date2) < @date1
SELECT @minutes=@minutes-1
SET @date2= DATEADD(mi, -@minutes, @date2)
SELECT @seconds=DATEDIFF(s, @date1, @date2)
IF DATEADD(s, -@seconds, @date2) < @date1
SELECT @seconds=@seconds-1
SET @date2= DATEADD(s, -@seconds, @date2)
SELECT @milliseconds=DATEDIFF(ms, @date1, @date2)
SELECT @result= ISNULL(CAST(NULLIF(@years,0) AS VARCHAR(10)) + ' years,','')
+ ISNULL(' ' + CAST(NULLIF(@months,0) AS VARCHAR(10)) + ' months,','')
+ ISNULL(' ' + CAST(NULLIF(@days,0) AS VARCHAR(10)) + ' days,','')
+ ISNULL(' ' + CAST(NULLIF(@hours,0) AS VARCHAR(10)) + ' hours,','')
+ ISNULL(' ' + CAST(@minutes AS VARCHAR(10)) + ' minutes and','')
+ ISNULL(' ' + CAST(@seconds AS VARCHAR(10))
+ CASE WHEN @milliseconds > 0 THEN '.' + CAST(@milliseconds AS VARCHAR(10))
ELSE '' END
+ ' seconds','')
SELECT @result
Voici le jeu de résultats.
2017 years, 11 months, 11 days, 7 hours, 8 minutes and 1.123 seconds
Pour obtenir des exemples plus étroitement liés, consultez DATEDIFF (Transact-SQL).