Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se aplica a:SQL Server
Azure SQL Database
Instancia administrada de Azure SQL
Azure Synapse Analytics
Analytics Platform System (PDW)
Punto de conexión de SQL Analytics en Microsoft Fabric
Almacén en Microsoft Fabric
Base de datos SQL en Microsoft Fabric
Esta función agrega un elemento number (un entero con signo) a un elemento datepart de un elemento date de entrada y devuelve un valor de fecha y hora modificado. Por ejemplo, puede usar esta función para buscar la fecha de 7000 minutos de hoy: número = 7000, datepart = minuto, fecha = hoy.
Esta función añade un número (un bigint con signo) a una parte de fecha de entrada y devuelve un valor modificado de fecha/hora. Por ejemplo, puede usar esta función para buscar la fecha de 7000 minutos de hoy: número = 7000, datepart = minuto, fecha = hoy.
Consulte Tipos y funciones de datos de fecha y hora para obtener información general sobre todos los tipos de datos y funciones de fecha y hora de Transact-SQL.
Convenciones de sintaxis de Transact-SQL
Syntax
DATEADD ( datepart , number , date )
Arguments
datepart
Parte de la fecha a la que DATEADD agrega un número int.
La parte de la fecha a la que DATEADD añade un número bigint.
En esta tabla se enumeran todos los argumentos válidos de datepart.
DATEADD no acepta los equivalentes de variables definidas por el usuario para los argumentos datepart.
| datepart | Abbreviations |
|---|---|
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 |
number
Expresión que se puede resolver como un valor int que DATEADD suma a un atributo datepart de date.
DATEADD acepta valores de variables definidas por el usuario para number.
DATEADD trunca un valor number especificado que tiene una fracción decimal. No redondea el valor numérico en esta situación.
Una expresión que puede resolverse en un bigint que DATEADD añade a una fecha de fecha.
DATEADD acepta valores de variables definidas por el usuario para number.
DATEADD trunca un valor number especificado que tiene una fracción decimal. No redondea el valor numérico en esta situación.
date
Una expresión que se puede resolver en uno de los valores siguientes:
- date
- datetime
- datetimeoffset
- datetime2
- smalldatetime
- time
Para date, DATEADD acepta una expresión de columna, expresión, literal de cadena o variable definida por el usuario. Un valor de literal de cadena se debe resolver en un argumento datetime. Para evitar problemas de ambigüedad, use años de cuatro dígitos. Consulte Configuración del servidor: límite de año de dos dígitos para obtener información sobre los años de dos dígitos.
Tipos de retorno
El tipo de datos de valores devueltos de este método es dinámico. El tipo devuelto depende del argumento proporcionado para date. Si el valor de date es una fecha de literal de cadena, DATEADD devuelve un valor datetime. Si se proporciona otro tipo válido de datos de entrada para date, DATEADD devuelve el mismo tipo de datos.
DATEADD genera un error si la escala de segundos literales de cadena supera tres posiciones decimales (.nnn) o si el literal de cadena contiene la parte de desplazamiento de zona horaria.
Valor devuelto
argumento datepart
dayofyear, dayy weekday devuelven el mismo valor.
Cada datepart y sus abreviaturas devuelven el mismo valor.
Si se cumple lo siguiente:
-
datepart es
month - el mes de date tiene más días que el mes que se devuelve
- el día de fecha no existe en el mes devuelto
Después, DATEADD devuelve el último día del mes que se devuelve. Por ejemplo, septiembre tiene 30 (treinta) días; por lo tanto, estas instrucciones devuelven 2024-09-30 00:00:00.000:
SELECT DATEADD(month, 1, '20240830');
SELECT DATEADD(month, 1, '2024-08-31');
argumento number
El argumento number no puede superar el intervalo de int. En las instrucciones siguientes, el argumento de number supera el intervalo de int en 1.
SELECT DATEADD(year, 2147483648, '20240731');
SELECT DATEADD(year, -2147483649, '20240731');
Estas instrucciones devuelven el siguiente mensaje de error:
Msg 8115, Level 16, State 2, Line 1
Arithmetic overflow error converting expression to data type int.
El argumento del número no puede superar el rango de bigint. En las siguientes afirmaciones, el argumento para el número excede el rango de bigint en 1.
DECLARE @datetime2 AS DATETIME2;
SET @datetime2 = '2025-11-01 01:01:01.1111111';
SELECT DATEADD(nanosecond, 9223372036854775808, @datetime2);
SELECT DATEADD(nanosecond, -9223372036854775809, @datetime2);
GO
Estas instrucciones devuelven el siguiente mensaje de error:
Msg 8115, Level 16, State 2, Line 3
Arithmetic overflow error converting expression to data type bigint.
argumento date
DATEADD no acepta un argumento date incrementado a un valor fuera del intervalo de su tipo de datos. En las instrucciones siguientes, el valor number que se agrega al valor date supera el intervalo del tipo de datos date.
SELECT DATEADD(year, 2147483647, '20240731');
SELECT DATEADD(year, -2147483647, '20240731');
DATEADD devuelve el siguiente mensaje de error:
Msg 517, Level 16, State 1
Line 1 Adding a value to a 'datetime' column caused overflow.
Valores devueltos para una fecha smalldatetime y un segundo o fracciones de segundos datepart
La parte correspondiente a los segundos de un valor smalldatetime siempre es 00. Para un valor de fechasmalldatetime, se aplica lo siguiente:
Para una parte datepart de
secondy un valor numérico entre -30 y +29,DATEADDno realiza ningún cambio.Para una parte datepart de
secondy un valor numérico menor que -30, o más de +29,DATEADDrealiza su adición a partir de un minuto.Para una parte datepart de
millisecondy un valor numérico entre -30001 y +29998,DATEADDno realiza ningún cambio.Para una datepart de
millisecondy un valor numérico menor que -30001, o más de +29998,DATEADDrealiza su adición a partir de un minuto.
Remarks
Use DATEADD en las cláusulas siguientes:
GROUP BYHAVINGORDER BYSELECT <list>WHERE
Precisión de fracciones de segundo
DATEADDno permite la adición de un elemento datepart de o microsecond para los tipos de nanosecond datos date smalldatetime, date y datetime.
Los milisegundos tienen una escala de 3 (.123), los microsegundos tienen una escala de 6 (.123456) y los nanosegundos tienen una escala de 9 (.123456789). Los tipos de datos time, datetime2 y datetimeoffset tienen una escala máxima de 7 (.1234567). Para una parte datepart de nanosecond, el número debe ser 100 antes del aumento de fracciones de segundos de fecha . Un número entre 1 y 49 redondea hasta 0, y un número de 50 a 99 redondea hasta 100.
Estas instrucciones agregan un elemento datepart de millisecond, microsecondo nanosecond.
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);
Este es el conjunto de resultados.
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
Ajuste de zona horaria
DATEADD no permite la adición para el desplazamiento de zona horaria.
Examples
A. Aumentar datepart en un intervalo de 1
Cada una de estas instrucciones aumenta datepart en un intervalo 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);
Este es el conjunto de resultados.
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. Incrementar más de un nivel de datepart en una instrucción
Cada una de estas instrucciones aumenta datepart en un valor number lo suficientemente grande como para incrementar también el siguiente valor superior datepart 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
C. Uso de expresiones como argumentos para los parámetros "number" y "date"
En los ejemplos siguientes se usan otros tipos de expresiones como argumentos para los parámetros number y date. En los ejemplos se usa la base de datos de AdventureWorks.
Especificación de una columna como fecha
En este ejemplo se agregan 2 (dos) días a cada valor de la columna OrderDate para derivar una nueva columna denominada PromisedShipDate:
SELECT SalesOrderID,
OrderDate,
DATEADD(day, 2, OrderDate) AS PromisedShipDate
FROM Sales.SalesOrderHeader;
Este es un conjunto de resultados parcial:
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
Especificación de variables definidas por el usuario como número y fecha
En este ejemplo se especifican variables definidas por el usuario como argumentos para number y 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);
Este es el conjunto de resultados.
2000-12-31 01:01:01.110
Especificación de la función de sistema escalar como fecha
En este ejemplo se especifica SYSDATETIME para date. El valor devuelto exacto depende del día y la hora de ejecución de la instrucción:
SELECT DATEADD(month, 1, SYSDATETIME());
Este es el conjunto de resultados.
2024-04-25 14:29:59.6727944
Especificación de subconsultas y funciones escalares como número y fecha
En este ejemplo se usan subconsultas escalares, MAX(ModifiedDate), como argumentos para number y date.
(SELECT TOP 1 BusinessEntityID FROM Person.Person) actúa como argumento artificial para el parámetro "number", para mostrar cómo se selecciona un argumento number de una lista de valores.
SELECT DATEADD(month,
(SELECT TOP 1 BusinessEntityID FROM Person.Person),
(SELECT MAX(ModifiedDate) FROM Person.Person)
);
Especificación de expresiones numéricas y funciones del sistema escalares como número y fecha
En este ejemplo se usa una expresión numérica (-(10 / 2)), operadores unarios (-), un operador aritmético (/) y funciones del sistema escalares (SYSDATETIME) como argumentos para number y date.
SELECT DATEADD(month, -(10 / 2), SYSDATETIME());
Especificar las funciones de clasificación como número
En este ejemplo se usa una función de categoría como argumento para 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;
Especificación de una función de ventana agregada como número
En este ejemplo se usa una función de ventana agregada como argumento para 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