DATEADD (Transact-SQL)DATEADD (Transact-SQL)

ESTE TEMA SE APLICA A: síSQL Server (a partir de 2008)síAzure SQL DatabasesíAzure SQL Data Warehouse síAlmacenamiento de datos paralelos THIS TOPIC APPLIES TO: yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

Esta función agrega un valor number especificado (como un entero con signo) a un atributo datepart determinado de un valor date de entrada y, después, devuelve el valor modificado.This function adds a specified number value (as a signed integer) to a specified datepart of an input date value, and then returns that modified value.

Vea Tipos de datos y funciones de fecha y hora (Transact-SQL) para obtener información general sobre todos los tipos de datos y las funciones de fecha y hora de Transact-SQLTransact-SQL.See Date and Time Data Types and Functions (Transact-SQL) for an overview of all Transact-SQLTransact-SQL date and time data types and functions.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

DATEADD (datepart , number , date )  

ArgumentosArguments

datepartdatepart
Es la parte de date a la que DATEADD agrega un valor number entero.The part of date to which DATEADD adds an integer number. En esta tabla se enumeran todos los argumentos válidos de datepart.This table lists all valid datepart arguments.

Nota

DATEADD no acepta los equivalentes de variables definidas por el usuario para los argumentos datepart.DATEADD does not accept user-defined variable equivalents for the datepart arguments.

datepartdatepart AbreviaturasAbbreviations
yearyear yy, yyyyyy, yyyy
quarterquarter qq, qqq, q
monthmonth mm, mmm, m
dayofyeardayofyear dy, ydy, y
dayday dd, ddd, d
weekweek wk, wwwk, ww
weekdayweekday dw, wdw, w
hourhour hhhh
minuteminute mi, nmi, n
secondsecond ss, sss, s
millisecondmillisecond msms
microsecondmicrosecond mcsmcs
nanosecondnanosecond nsns

numbernumber
Expresión que se puede resolver como un valor int que DATEADD suma a un atributo datepart de date.An expression that can resolve to an int that DATEADD adds to a datepart of date. DATEADD acepta valores de variables definidas por el usuario para number.DATEADD accepts user-defined variable values for number. DATEADD truncará un valor number especificado que tiene una fracción decimal.DATEADD will truncate a specified number value that has a decimal fraction. En esta situación no se redondeará el valor number.It will not round the number value in this situation.

datedate
Una expresión que se puede resolver en uno de los valores siguientes:An expression that can resolve to one of the following values:

  • datedate
  • datetimedatetime
  • datetimeoffsetdatetimeoffset
  • datetime2datetime2
  • smalldatetimesmalldatetime
  • timetime

Para date, DATEADD aceptará una expresión de columna, una expresión, un literal de cadena o una variable definida por el usuario.For date, DATEADD will accept a column expression, expression, string literal, or user-defined variable. Un valor de literal de cadena se debe resolver en un argumento datetime.A string literal value must resolve to a datetime. Para evitar problemas de ambigüedad, use años de cuatro dígitos.Use four-digit years to avoid ambiguity issues. Vea Establecer la opción de configuración del servidor Fecha límite de año de dos dígitos para obtener información sobre los años de dos dígitos.See Configure the two digit year cutoff Server Configuration Option for information about two-digit years.

Tipos de valores devueltosReturn types

El tipo de datos del argumento date se convierte en el tipo de datos del valor devuelto DATEADD, excepto para los valores date de literal de cadena.The date argument data type becomes the DATEADD return value data type, except for string literal date values. Para un literal de cadena, DATEADD devuelve un valor datetime.For a string literal, DATEADD returns a datetime value. DATEADD producirá un error si la escala de segundos del literal de cadena supera tres posiciones decimales (.nnn) o si el literal de cadena contiene la parte de desplazamiento de zona horaria.DATEADD will raise an error if the string literal seconds scale exceeds three decimal place positions (.nnn) or if the string literal contains the time zone offset part.

Valor devueltoReturn Value

Argumento datepartdatepart Argument

dayofyear, day y weekday devuelven el mismo valor.dayofyear, day, and weekday return the same value.

Cada datepart y sus abreviaturas devuelven el mismo valor.Each datepart and its abbreviations return the same value.

Si se cumple lo siguiente:If the following are true:

  • datepart es monthdatepart is month
  • el mes de date tiene más días que el mes que se devuelvethe date month has more days than the return month
  • el día de date no existe en el mes que se devuelvethe date day does not exist in the return month

Después, DATEADD devuelve el último día del mes que se devuelve.Then, DATEADD returns the last day of the return month. Por ejemplo, septiembre tiene 30 días; por tanto, estas instrucciones devuelven 30-09-2006 00:00:00.000:For example, September has 30 (thirty) days; therefore, these statements return 2006-09-30 00:00:00.000:

SELECT DATEADD(month, 1, '20060830');
SELECT DATEADD(month, 1, '20060831');

Argumento numbernumber Argument

El argumento number no puede superar el intervalo de int. En estas instrucciones, el argumento para number supera el intervalo de int en uno.The number argument cannot exceed the range of int. In the following statements, the argument for number exceeds the range of int by 1. Estas instrucciones devuelven el mensaje de error siguiente: "Msg 8115, Level 16, State 2, Line 1. Arithmetic overflow error converting expression to data type int."These statements both return the following error message: "Msg 8115, Level 16, State 2, Line 1. Arithmetic overflow error converting expression to data type int."

SELECT DATEADD(year,2147483648, '20060731');  
SELECT DATEADD(year,-2147483649, '20060731');  

Argumento datedate Argument

DATEADD no aceptará un argumento date incrementado a un valor fuera del intervalo de su tipo de datos.DATEADD will not accept a date argument incremented to a value outside the range of its data type. En las instrucciones siguientes, el valor number que se agrega al valor date supera el intervalo del tipo de datos date.In the following statements, the number value added to the date value exceeds the range of the date data type. DATEADD devuelve el mensaje de error siguiente: "Msg 517, Level 16, State 1, Line 1 Adding a value to a 'datetime' column caused overflow".DATEADD returns the following error message: "Msg 517, Level 16, State 1, Line 1 Adding a value to a 'datetime' column caused overflow."

SELECT DATEADD(year,2147483647, '20060731');  
SELECT DATEADD(year,-2147483647, '20060731');  

Valores devueltos para una fecha smalldatetime y datepart de un segundo o fracciones de segundoReturn Values for a smalldatetime date and a second or Fractional Seconds datepart

La parte correspondiente a los segundos de un valor smalldatetime siempre es 00.The seconds part of a smalldatetime value is always 00. Para un valor date smalldatetime, se aplica lo siguiente:For a smalldatetime date value, the following apply:

  • Para un argumento datepart de second y un valor number comprendido entre -30 y +29, DATEADD no realiza ningún cambio.For a datepart of second, and a number value between -30 and +29, DATEADD makes no changes.
  • Para un argumento datepart de second y un valor number menor que -30 o mayor de +29, DATEADD realiza la suma a partir de un minuto.For a datepart of second, and a number value less than -30, or more than +29, DATEADD performs its addition beginning at one minute.
  • Para un argumento datepart de millisecond y un valor number comprendido entre -30001 y +29998, DATEADD no realiza ningún cambio.For a datepart of millisecond and a number value between -30001 and +29998, DATEADD makes no changes.
  • Para un argumento datepart de millisecond y un valor number menor que -30001 o mayor de +29998, DATEADD realiza la suma a partir de un minuto.For a datepart of millisecond and a number value less than -30001, or more than +29998, DATEADD performs its addition beginning at one minute.

NotasRemarks

Use DATEADD en las cláusulas siguientes:Use DATEADD in the following clauses:

  • GROUP BYGROUP BY
  • HAVINGHAVING
  • ORDER BYORDER BY
  • SELECT <lista>SELECT <list>
  • WHEREWHERE

Precisión de fracciones de segundoFractional seconds precision

DATEADD no permite sumar un valor datepart de microsecond o nanosecond para los tipos de datos de date como smalldatetime, date y datetime.DATEADD does not allow addition for a datepart of microsecond or nanosecond for date data types smalldatetime, date, and datetime.

Los milisegundos tienen una escala de 3 (0,123), los microsegundos tienen una escala de 6 (0,123456) y los nanosegundos tienen una escala de 9 (0,123456789).Milliseconds have a scale of 3 (.123), microseconds have a scale of 6 (.123456), and nanoseconds have a scale of 9 (.123456789). Los tipos de datos time, datetime2 y datetimeoffset tienen una escala máxima de 7 (.1234567).The time, datetime2, and datetimeoffset data types have a maximum scale of 7 (.1234567). Para un argumento datepart de nanosecond, number debe ser 100 antes de que aumenten las fracciones de segundos de date.For a datepart of nanosecond, number must be 100 before the fractional seconds of date increase. Un valor number comprendido entre 1 y 49 se redondeará hacia abajo hasta 0, y un número entre 50 a 99 se redondeará hacia arriba hasta 100.A number between 1 and 49 will round down to 0, and a number from 50 to 99 rounds up to 100.

Estas instrucciones agregan un atributo datepart de millisecond, microsecond o nanosecond.These statements add a datepart of millisecond, microsecond, or nanosecond.

DECLARE @datetime2 datetime2 = '2007-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);  

El conjunto de resultados es el siguiente.Here is the result set.

1 millisecond     2007-01-01 13:10:10.1121111  
2 milliseconds    2007-01-01 13:10:10.1131111  
1 microsecond     2007-01-01 13:10:10.1111121  
2 microseconds    2007-01-01 13:10:10.1111131  
49 nanoseconds    2007-01-01 13:10:10.1111111  
50 nanoseconds    2007-01-01 13:10:10.1111112  
150 nanoseconds   2007-01-01 13:10:10.1111113  

Ajuste de zona horariaTime zone offset

DATEADD no permite la suma para el desplazamiento de zona horaria.DATEADD does not allow addition for time zone offset.

EjemplosExamples

A.A. Aumentar datepart en un intervalo de 1Incrementing datepart by an interval of 1

Cada una de estas instrucciones aumenta datepart en un intervalo de 1:Each of these statements increments datepart by an interval of 1:

DECLARE @datetime2 datetime2 = '2007-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);  

El conjunto de resultados es el siguiente.Here is the result set.

Year         2008-01-01 13:10:10.1111111  
quarter      2007-04-01 13:10:10.1111111  
month        2007-02-01 13:10:10.1111111  
dayofyear    2007-01-02 13:10:10.1111111  
day          2007-01-02 13:10:10.1111111  
week         2007-01-08 13:10:10.1111111  
weekday      2007-01-02 13:10:10.1111111  
hour         2007-01-01 14:10:10.1111111  
minute       2007-01-01 13:11:10.1111111  
second       2007-01-01 13:10:11.1111111  
millisecond  2007-01-01 13:10:10.1121111  
microsecond  2007-01-01 13:10:10.1111121  
nanosecond   2007-01-01 13:10:10.1111111  

B.B. Aumentar más de un nivel de datepart en una instrucciónIncrementing more than one level of datepart in one statement

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:Each of these statements increments datepart by a number large enough to additionally increment the next higher datepart of date:

DECLARE @datetime2 datetime2;  
SET @datetime2 = '2007-01-01 01:01:01.1111111';  
--Statement                                 Result     
-------------------------------------------------------------------   
SELECT DATEADD(quarter,4,@datetime2);     --2008-01-01 01:01:01.1111111  
SELECT DATEADD(month,13,@datetime2);      --2008-02-01 01:01:01.1111111  
SELECT DATEADD(dayofyear,365,@datetime2); --2008-01-01 01:01:01.1111111  
SELECT DATEADD(day,365,@datetime2);       --2008-01-01 01:01:01.1111111  
SELECT DATEADD(week,5,@datetime2);        --2007-02-05 01:01:01.1111111  
SELECT DATEADD(weekday,31,@datetime2);    --2007-02-01 01:01:01.1111111  
SELECT DATEADD(hour,23,@datetime2);       --2007-01-02 00:01:01.1111111  
SELECT DATEADD(minute,59,@datetime2);     --2007-01-01 02:00:01.1111111  
SELECT DATEADD(second,59,@datetime2);     --2007-01-01 01:02:00.1111111  
SELECT DATEADD(millisecond,1,@datetime2); --2007-01-01 01:01:01.1121111  

C.C. Utilizar las expresiones como argumentos para los parámetros number y dateUsing expressions as arguments for the number and date parameters

En los ejemplos siguientes se usan otros tipos de expresiones como argumentos para los parámetros number y date.These examples use different types of expressions as arguments for the number and date parameters. En los ejemplos se usa la base de datos de AdventureWorks.The examples use the AdventureWorks database.

Especificar una columna como fechaSpecifying a column as date

En este ejemplo se agregan 2 (dos) días a cada valor de la columna OrderDate para derivar una nueva columna denominada PromisedShipDate:This example adds 2 (two) days to each value in the OrderDate column, to derive a new column named PromisedShipDate:

SELECT SalesOrderID  
    ,OrderDate   
    ,DATEADD(day,2,OrderDate) AS PromisedShipDate  
FROM Sales.SalesOrderHeader;  

Un conjunto de resultados parcial:A partial result set:

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  

Especificar las variables definidas por el usuario como number y dateSpecifying user-defined variables as number and date

En este ejemplo se especifican variables definidas por el usuario como argumentos para number y date:This example specifies user-defined variables as arguments for number and date:

DECLARE @days int = 365,   
        @datetime datetime = '2000-01-01 01:01:01.111'; /* 2000 was a leap year */;  
SELECT DATEADD(day, @days, @datetime);  

El conjunto de resultados es el siguiente.Here is the result set.

-----------------------  
2000-12-31 01:01:01.110  

(1 row(s) affected)  

Especificar la función de sistema escalar como dateSpecifying scalar system function as date

En este ejemplo se especifica SYSDATETIME para date.This example specifies SYSDATETIME for date. El valor devuelto exacto depende del día y la hora de ejecución de la instrucción:The exact value returned depends on the day and time of statement execution:

SELECT DATEADD(month, 1, SYSDATETIME());  

El conjunto de resultados es el siguiente.Here is the result set.

---------------------------  
2013-02-06 14:29:59.6727944  

(1 row(s) affected)  

Especificar subconsultas y funciones escalares como number y dateSpecifying scalar subqueries and scalar functions as number and date

En este ejemplo se usan subconsultas escalares, MAX(ModifiedDate), como argumentos para number y date.This example uses scalar subqueries, MAX(ModifiedDate), as arguments for number and 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 TOP 1 BusinessEntityID FROM Person.Person) serves as an artificial argument for the number parameter, to show how to select a number argument from a value list.

SELECT DATEADD(month,(SELECT TOP 1 BusinessEntityID FROM Person.Person),  
    (SELECT MAX(ModifiedDate) FROM Person.Person));  

Especificar expresiones numéricas y funciones del sistema escalares como number y dateSpecifying numeric expressions and scalar system functions as number and date

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.This example uses a numeric expression (-(10/2)), unary operators (-), an arithmetic operator (/), and scalar system functions (SYSDATETIME) as arguments for number and date.

SELECT DATEADD(month,-(10/2), SYSDATETIME());  

Especificar las funciones de clasificación como numberSpecifying ranking functions as number

En este ejemplo se usa una función de categoría como argumento para number.This example uses a ranking function as an argument for 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;  

Especificar una función de ventana agregada como numberSpecifying an aggregate window function as number

En este ejemplo se usa una función de ventana agregada como argumento para number.This example uses an aggregate window function as an argument for 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  

Vea tambiénSee also

CAST y CONVERT (Transact-SQL)CAST and CONVERT (Transact-SQL)