Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
S’applique à :SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
SQL analytics endpoint in Microsoft Fabric
Warehouse in Microsoft Fabric
Cette fonction ajoute un number (entier signé) au datepart d’une date entrée, et retourne une valeur de date/heure modifiée. Par exemple, vous pouvez utiliser cette fonction pour rechercher la date de 7 000 minutes du jour : nombre = 7000, datepart = minute, date = aujourd’hui.
Consultez les types et fonctions de données date et heure pour obtenir une vue d’ensemble de tous les types et fonctions de données de date et d’heure Transact-SQL.
Conventions de la syntaxe Transact-SQL
Syntaxe
DATEADD (datepart , number , date )
Les arguments
datepart
Partie de la date à laquelle DATEADD
ajoute un nombre int.
Remarque
Dans Azure SQL Database, Azure SQL Managed Instance et base de données SQL dans Microsoft Fabric, le nombre peut être exprimé en tant que bigint. Cette fonctionnalité est en préversion.
Ce tableau répertorie tous les arguments datepart valides.
DATEADD
n’accepte pas d’équivalents de variables définis par l’utilisateur pour les arguments datepart.
datepart | Abréviations |
---|---|
year |
yy , yyyy |
quarter |
qq , q |
month |
mm , m |
dayofyear |
dy , y |
day |
dd , d |
week |
wk , ww |
weekday |
dw , w |
hour |
hh |
minute |
mi , n |
second |
ss , s |
millisecond |
ms |
microsecond |
mcs |
nanosecond |
ns |
nombre
Expression qui peut être résolue en int ajouté par DATEADD
au datepart de date.
DATEADD
accepte les valeurs des variables définies par l’utilisateur pour number.
DATEADD
tronque une valeur numérique spécifique ayant une fraction décimale. Il n’arrondit pas la valeur numérique dans cette situation.
Remarque
Dans Azure SQL Database et sql Database dans Microsoft Fabric, le nombre peut être exprimé sous la forme d’un bigint. Cette fonctionnalité est en préversion.
date
Expression qui peut être résolue en valeur, parmi les suivantes :
- date
- datetime
- datetimeoffset
- datetime2
- smalldatetime
- temps
Pour la date, accepte une expression de DATEADD
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. Consultez la configuration du serveur : coupure d’un an à deux chiffres pour plus d’informations sur les années à deux chiffres.
Types de retour
Le type de données de la valeur de retour pour cette méthode est dynamique. Le type de retour dépend de l’argument fourni pour date
. Si la valeur de date
est un littéral de chaîne de date, DATEADD
retourne une valeur datetime. Si un autre type de données d’entrée valide est fourni pour date
, DATEADD
retourne le même type de données.
DATEADD
génère une erreur si l’échelle littérale de chaîne dépasse trois positions décimales (.nnn
) ou si le littéral de chaîne contient la partie offset du fuseau horaire.
Valeur retournée
argument datepart
dayofyear
, day
et weekday
retourne la même valeur.
Chaque datepart et ses abréviations retournent la même valeur.
Si les conditions suivantes sont remplies :
-
datepart est
month
- Le mois de date a plus de jours que le mois retourné.
- le jour de date n’existe pas dans le mois de retour
DATEADD
retourne alors le dernier jour du mois retourné. Par exemple, septembre a 30 (trente) jours ; par conséquent, ces instructions retournent 2024-09-30 00:00:00.000
:
SELECT DATEADD(month, 1, '20240830');
SELECT DATEADD(month, 1, '2024-08-31');
nombre d’arguments
L’argument nombre ne peut pas dépasser la plage d’int. Dans les instructions suivantes, l’argument du nombre dépasse la plage d’int par 1.
SELECT DATEADD(year, 2147483648, '20240731');
SELECT DATEADD(year, -2147483649, '20240731');
Ces instructions retournent tous deux le message d’erreur suivant :
Msg 8115, Level 16, State 2, Line 1. Arithmetic overflow error converting expression to data type int.
Remarque
Dans Azure SQL Database et sql Database dans Microsoft Fabric, le nombre peut être exprimé sous la forme d’un bigint. Cette fonctionnalité est en préversion.
argument date
DATEADD
n’accepte pas d’argument de date incrémenté vers une valeur en dehors de la plage de son type de données. Dans les instructions suivantes, la valeur number ajoutée à la valeur date dépasse la plage du type de données date.
SELECT DATEADD(year, 2147483647, '20240731');
SELECT DATEADD(year, -2147483647, '20240731');
DATEADD
retourne le message d’erreur suivant :
Msg 517, Level 16, State 1, Line 1 Adding a value to a 'datetime' column caused overflow.
Retourne des valeurs pour une date de petite date et une seconde ou fraction de seconde seconde
La partie des secondes d’une valeur smalldatetime est toujours 00. Pour une valeur datesmalldatetime, les remarques suivantes s’appliquent :
Pour une partie de date de
second
, et une valeur numérique comprise entre -30 et +29,DATEADD
n’apporte aucune modification.Pour une partie de date de
second
, et une valeur numérique inférieure à -30, ou plus de +29,DATEADD
effectue son ajout à partir d’une minute.Pour une partie de date et
millisecond
une valeur numérique comprises entre -30001 et +29998,DATEADD
n’apporte aucune modification.Pour une partie
millisecond
de date et une valeur numérique inférieure à -30001, ou plus de +29998,DATEADD
effectue son ajout à partir d’une minute.
Notes
Utilisez DATEADD
dans les clauses suivantes :
GROUP BY
HAVING
ORDER BY
SELECT <list>
WHERE
Précision en fractions de seconde
DATEADD
n’autorise pas l’ajout d’une partie de date ou pour microsecond
, date et nanosecond
.
Les millisecondes ont une échelle de 3 (.123
), les microsecondes ont une échelle de 6 (.123456
) et les nanosecondes ont une échelle de 9 (.123456789
). Les types de données time, datetime2 et datetimeoffset ont une échelle maximale de 7 (.1234567
). Pour une partie de date de nanosecond
, le nombre doit être de 100 avant l’augmentation fractionnaire de date . Un nombre compris entre 1 et 49 arrondit à 0, et un nombre compris entre 50 et 99 arrondit jusqu’à 100.
Ces instructions ajoutent une , millisecond
ou microsecond
.
DECLARE @datetime2 AS DATETIME2 = '2024-01-01 13:10:10.1111111';
SELECT '1 millisecond', DATEADD(millisecond, 1, @datetime2)
UNION ALL
SELECT '2 milliseconds', DATEADD(millisecond, 2, @datetime2)
UNION ALL
SELECT '1 microsecond', DATEADD(microsecond, 1, @datetime2)
UNION ALL
SELECT '2 microseconds', DATEADD(microsecond, 2, @datetime2)
UNION ALL
SELECT '49 nanoseconds', DATEADD(nanosecond, 49, @datetime2)
UNION ALL
SELECT '50 nanoseconds', DATEADD(nanosecond, 50, @datetime2)
UNION ALL
SELECT '150 nanoseconds', DATEADD(nanosecond, 150, @datetime2);
Voici le jeu de résultats.
1 millisecond 2024-01-01 13:10:10.1121111
2 milliseconds 2024-01-01 13:10:10.1131111
1 microsecond 2024-01-01 13:10:10.1111121
2 microseconds 2024-01-01 13:10:10.1111131
49 nanoseconds 2024-01-01 13:10:10.1111111
50 nanoseconds 2024-01-01 13:10:10.1111112
150 nanoseconds 2024-01-01 13:10:10.1111113
Décalage de fuseau horaire
DATEADD
n’autorise pas l’ajout du décalage de fuseau horaire.
Exemples
R. Incrémenter une partie de date d'un intervalle de 1
Chacune de ces instructions incrémente datepart d’un intervalle de 1 :
DECLARE @datetime2 AS DATETIME2 = '2024-01-01 13:10:10.1111111';
SELECT 'year', DATEADD(year, 1, @datetime2)
UNION ALL
SELECT 'quarter', DATEADD(quarter, 1, @datetime2)
UNION ALL
SELECT 'month', DATEADD(month, 1, @datetime2)
UNION ALL
SELECT 'dayofyear', DATEADD(dayofyear, 1, @datetime2)
UNION ALL
SELECT 'day', DATEADD(day, 1, @datetime2)
UNION ALL
SELECT 'week', DATEADD(week, 1, @datetime2)
UNION ALL
SELECT 'weekday', DATEADD(weekday, 1, @datetime2)
UNION ALL
SELECT 'hour', DATEADD(hour, 1, @datetime2)
UNION ALL
SELECT 'minute', DATEADD(minute, 1, @datetime2)
UNION ALL
SELECT 'second', DATEADD(second, 1, @datetime2)
UNION ALL
SELECT 'millisecond', DATEADD(millisecond, 1, @datetime2)
UNION ALL
SELECT 'microsecond', DATEADD(microsecond, 1, @datetime2)
UNION ALL
SELECT 'nanosecond', DATEADD(nanosecond, 1, @datetime2);
Voici le jeu de résultats.
year 2025-01-01 13:10:10.1111111
quarter 2024-04-01 13:10:10.1111111
month 2024-02-01 13:10:10.1111111
dayofyear 2024-01-02 13:10:10.1111111
day 2024-01-02 13:10:10.1111111
week 2024-01-08 13:10:10.1111111
weekday 2024-01-02 13:10:10.1111111
hour 2024-01-01 14:10:10.1111111
minute 2024-01-01 13:11:10.1111111
second 2024-01-01 13:10:11.1111111
millisecond 2024-01-01 13:10:10.1121111
microsecond 2024-01-01 13:10:10.1111121
nanosecond 2024-01-01 13:10:10.1111111
B. Incrémenter plusieurs niveaux de datepart dans une instruction
Chacune de ces instructions incrémente datepart d’une valeur number assez grande pour incrémenter également la valeur datepart immédiatement supérieure de date :
DECLARE @datetime2 AS DATETIME2;
SET @datetime2 = '2024-01-01 01:01:01.1111111';
--Statement Result
-------------------------------------------------------------------
SELECT DATEADD(quarter, 4, @datetime2); --2025-01-01 01:01:01.1111111
SELECT DATEADD(month, 13, @datetime2); --2025-02-01 01:01:01.1111111
SELECT DATEADD(dayofyear, 366, @datetime2); --2025-01-01 01:01:01.1111111
SELECT DATEADD(day, 366, @datetime2); --2025-01-01 01:01:01.1111111
SELECT DATEADD(week, 5, @datetime2); --2024-02-05 01:01:01.1111111
SELECT DATEADD(weekday, 31, @datetime2); --2024-02-01 01:01:01.1111111
SELECT DATEADD(hour, 23, @datetime2); --2024-01-02 00:01:01.1111111
SELECT DATEADD(minute, 59, @datetime2); --2024-01-01 02:00:01.1111111
SELECT DATEADD(second, 59, @datetime2); --2024-01-01 01:02:00.1111111
SELECT DATEADD(millisecond, 1, @datetime2); --2024-01-01 01:01:01.1121111
Chapitre C. Utiliser des expressions comme arguments pour les paramètres de date et de numéro
Ces exemples utilisent différents types d’expressions comme arguments pour les paramètres number et date. Ces exemples utilisent la base de données AdventureWorks.
Spécifier une colonne comme date
Cet exemple ajoute 2
(deux) jours à chaque valeur dans la colonne OrderDate
pour dériver une nouvelle colonne nommée PromisedShipDate
:
SELECT SalesOrderID,
OrderDate,
DATEADD(day, 2, OrderDate) AS PromisedShipDate
FROM Sales.SalesOrderHeader;
Voici un jeu de résultats partiel :
SalesOrderID OrderDate PromisedShipDate
------------ ----------------------- -----------------------
43659 2005-07-01 00:00:00.000 2005-07-03 00:00:00.000
43660 2005-07-01 00:00:00.000 2005-07-03 00:00:00.000
43661 2005-07-01 00:00:00.000 2005-07-03 00:00:00.000
...
43702 2005-07-02 00:00:00.000 2005-07-04 00:00:00.000
43703 2005-07-02 00:00:00.000 2005-07-04 00:00:00.000
43704 2005-07-02 00:00:00.000 2005-07-04 00:00:00.000
43705 2005-07-02 00:00:00.000 2005-07-04 00:00:00.000
43706 2005-07-03 00:00:00.000 2005-07-05 00:00:00.000
...
43711 2005-07-04 00:00:00.000 2005-07-06 00:00:00.000
43712 2005-07-04 00:00:00.000 2005-07-06 00:00:00.000
...
43740 2005-07-11 00:00:00.000 2005-07-13 00:00:00.000
43741 2005-07-12 00:00:00.000 2005-07-14 00:00:00.000
Spécifier des variables définies par l'utilisateur comme numéro et date
Cet exemple spécifie des variables définies par l’utilisateur comme arguments pour number et date :
DECLARE
@days AS INT = 365,
@datetime AS DATETIME = '2000-01-01 01:01:01.111'; /* 2000 was a leap year */
SELECT DATEADD(day, @days, @datetime);
Voici le jeu de résultats.
2000-12-31 01:01:01.110
Spécifier la fonction système scalaire comme date
Cet exemple spécifie SYSDATETIME
pour date. La valeur exacte retournée varie selon le jour et l’heure de l’exécution de l’instruction :
SELECT DATEADD(month, 1, SYSDATETIME());
Voici le jeu de résultats.
2024-04-25 14:29:59.6727944
Spécifier des sous-requêtes scalaires et de fonctions scalaires comme numéro et date
Cet exemple utilise des sous-requêtes scalaires, MAX(ModifiedDate)
, comme arguments pour number et date.
(SELECT TOP 1 BusinessEntityID FROM Person.Person)
sert d’argument artificiel pour le paramètre number pour illustrer la sélection d’un argument number dans une liste de valeurs.
SELECT DATEADD(month,
(SELECT TOP 1 BusinessEntityID FROM Person.Person),
(SELECT MAX(ModifiedDate) FROM Person.Person)
);
Spécifier des expressions numériques et de fonctions système scalaires comme numéro et date
Cet exemple utilise une expression numérique (-(10 / 2)
), des opérateurs unaires (-
), un opérateur arithmétique (/
) et des fonctions système scalaires (SYSDATETIME
) comme arguments pour le nombre et la date.
SELECT DATEADD(month, -(10 / 2), SYSDATETIME());
Spécifier les fonctions de classement comme nombre
Cet exemple utilise une fonction de classement comme argument pour number.
SELECT p.FirstName,
p.LastName,
DATEADD(day, ROW_NUMBER() OVER (ORDER BY a.PostalCode), SYSDATETIME()) AS 'Row Number'
FROM Sales.SalesPerson AS s
INNER JOIN Person.Person AS p
ON s.BusinessEntityID = p.BusinessEntityID
INNER JOIN Person.Address AS a
ON a.AddressID = p.BusinessEntityID
WHERE TerritoryID IS NOT NULL
AND SalesYTD <> 0;
Spécifier une fonction d'agrégation de fenêtres comme numéro
Cet exemple utilise une fonction d’agrégation comme argument pour number.
SELECT SalesOrderID,
ProductID,
OrderQty,
DATEADD(day, SUM(OrderQty) OVER (PARTITION BY SalesOrderID), SYSDATETIME()) AS 'Total'
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN (43659, 43664);
GO