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

SI APPLICA A: sìSQL Server sìDatabase SQL di Azure sìAzure Synapse Analytics (SQL DW) sìParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

Questa funzione aggiunge il valore number specificato (ad esempio un intero con segno) a un datepart del valore date di input e quindi restituisce il valore modificato.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.

Vedere Funzioni e tipi di dati di data e ora (Transact-SQL) per una panoramica di tutti i tipi di dati e delle funzioni di data e ora di 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.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintassiSyntax

DATEADD (datepart , number , date )  

ArgomentiArguments

datepartdatepart
Parte di date a cui DATEADD aggiunge un valore number di tipo integer.The part of date to which DATEADD adds an integer number. Questa tabella elenca tutti gli argomenti validi per datepart.This table lists all valid datepart arguments.

Nota

DATEADD non accetta equivalenti di variabili definite dall'utente come argomenti di datepart.DATEADD does not accept user-defined variable equivalents for the datepart arguments.

datepartdatepart AbbreviazioniAbbreviations
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
Espressione che può essere risolta in un tipo int aggiunto da DATEADD a un elemento datepart di date.An expression that can resolve to an int that DATEADD adds to a datepart of date. DATEADD accetta valori di variabili definite dall'utente per number.DATEADD accepts user-defined variable values for number. DATEADD tronca un valore number specificato che contenga una frazione decimale.DATEADD will truncate a specified number value that has a decimal fraction. In questa situazione, non arrotonda il valore number.It will not round the number value in this situation.

datadate
Espressione che può risolversi in uno dei valori seguenti:An expression that can resolve to one of the following values:

  • datadate
  • datetimedatetime
  • datetimeoffsetdatetimeoffset
  • datetime2datetime2
  • smalldatetimesmalldatetime
  • timetime

Per date, DATEADD accetta un'espressione di colonna, un'espressione, un valore letterale stringa o una variabile definita dall'utente.For date, DATEADD will accept a column expression, expression, string literal, or user-defined variable. Un valore stringa deve risolversi in un elemento datetime.A string literal value must resolve to a datetime. Per evitare problemi di ambiguità, esprimere gli anni nel formato a quattro cifre.Use four-digit years to avoid ambiguity issues. Per informazioni sugli anni a due cifre, vedere Configurare l'opzione di configurazione del server Cambio data per anno a due cifre.See Configure the two digit year cutoff Server Configuration Option for information about two-digit years.

Tipi restituitiReturn types

Il tipo di dati del valore restituito per questo metodo è dinamico.The return value data type for this method is dynamic. Il tipo restituito dipende dall'argomento specificato per date.The return type depends on the argument supplied for date. Se il valore per date è una data letterale stringa, DATEADD restituisce un valore datetime.If the value for date is a string literal date, DATEADD returns a datetime value. Se viene fornito un altro tipo di dati di input valido per date, DATEADD restituisce lo stesso tipo di dati.If another valid input data type is supplied for date, DATEADD returns the same data type. DATEADD genera un errore se la scala dei secondi del valore letterale stringa supera tre posizioni decimali (.nnn) o se il valore letterale stringa contiene la parte relativa alla differenza di fuso orario.DATEADD raises 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.

Valore restituitoReturn Value

Argomento datepartdatepart Argument

dayofyear, day, e weekday restituiscono lo stesso valore.dayofyear, day, and weekday return the same value.

Ogni elemento datepart e le relative abbreviazioni restituiscono lo stesso valore.Each datepart and its abbreviations return the same value.

Se si verificano le condizioni seguenti:If the following are true:

  • datepart è monthdatepart is month
  • il mese di date ha più giorni del mese restituitothe date month has more days than the return month
  • il giorno di data non esiste nel mese restituitothe date day does not exist in the return month

DATEADD restituisce l'ultimo giorno del mese restituito.Then, DATEADD returns the last day of the return month. Settembre, ad esempio, ha 30 (trenta) giorni. Queste istruzioni, pertanto, restituiscono 2006-09-30 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');

Argomento numbernumber Argument

Un argomento number non può superare l'intervallo del tipo int. Nelle istruzioni seguenti l'argomento per il parametro number supera l'intervallo di int di una unità.The number argument cannot exceed the range of int. In the following statements, the argument for number exceeds the range of int by 1. Queste istruzioni restituiscono entrambe il messaggio di errore seguente: "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');  

Argomento datedate Argument

DATEADD non accetta un argomento date incrementato a un valore al di fuori dell'intervallo consentito per il tipo di dati corrispondente.DATEADD will not accept a date argument incremented to a value outside the range of its data type. Nelle istruzioni seguenti il valore number aggiunto al valore date supera l'intervallo del tipo di dati date.In the following statements, the number value added to the date value exceeds the range of the date data type. DATEADD restituisce il messaggio di errore seguente: "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');  

Valori restituiti per una data smalldatetime e un valore datepart in secondi o secondi frazionariReturn Values for a smalldatetime date and a second or Fractional Seconds datepart

La seconda parte di un valore smalldatetime è sempre 00.The seconds part of a smalldatetime value is always 00. Per un valore date smalldatetime, si applica quanto segue:For a smalldatetime date value, the following apply:

  • Per un datepart seconde un valore number compreso tra -30 e + 29, DATEADD non apporta modifiche.For a datepart of second, and a number value between -30 and +29, DATEADD makes no changes.
  • Per un datepart seconde un valore number minore di -30 o maggiore di + 29, DATEADD esegue l'aggiunta a partire da 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.
  • Per un datepart milliseconde un valore number compreso tra -30001 e + 29998, DATEADD non apporta modifiche.For a datepart of millisecond and a number value between -30001 and +29998, DATEADD makes no changes.
  • Per un datepart milliseconde un valore number minore di -30001 o maggiore di + 29998, DATEADD esegue l'aggiunta a partire da 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.

RemarksRemarks

Usare DATEADD nelle clausole seguenti:Use DATEADD in the following clauses:

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

Precisione in secondi frazionariFractional seconds precision

DATEADD non consente l'aggiunta per un elemento datepart microsecond o nanosecond per i tipi di dati date smalldatetime, date e datetime.DATEADD does not allow addition for a datepart of microsecond or nanosecond for date data types smalldatetime, date, and datetime.

I millisecondi hanno una scala di 3 (.123), i microsecondi hanno una scala di 6 (.123456) e i nanosecondi hanno una scala di 9 (.123456789).Milliseconds have a scale of 3 (.123), microseconds have a scale of 6 (.123456), and nanoseconds have a scale of 9 (.123456789). I tipi di dati time, datetime2 e datetimeoffset hanno una scala massima pari a 7 (0,1234567).The time, datetime2, and datetimeoffset data types have a maximum scale of 7 (.1234567). Per un elemento datepart nanosecond, number deve essere pari a 100 prima che i secondi frazionari di date aumentino.For a datepart of nanosecond, number must be 100 before the fractional seconds of date increase. Un valore number compreso tra 1 e 49 viene arrotondato per difetto a 0 e un valore number da 50 a 99 viene arrotondato per eccesso a 100.A number between 1 and 49 will round down to 0, and a number from 50 to 99 rounds up to 100.

Queste istruzioni aggiungono un valore datepart 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);  

Set di risultati: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  

Differenza di fuso orarioTime zone offset

DATEADD non consente l'aggiunta per la differenza di fuso orario.DATEADD does not allow addition for time zone offset.

EsempiExamples

A.A. Incremento di un datepart a intervalli di una unitàIncrementing datepart by an interval of 1

Ognuna di queste istruzioni incrementa il valore datepart a intervalli di una unità: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);  

Set di risultati: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. Incremento di più livelli di datepart in un'unica istruzioneIncrementing more than one level of datepart in one statement

Ognuna di queste istruzioni incrementa datepart di un valore number abbastanza grande da incrementare anche l'argomento datepart di livello immediatamente più alto di 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. Utilizzo di espressioni come argomenti per i parametri number e dateUsing expressions as arguments for the number and date parameters

In questi esempi vengono usati tipi diversi di espressioni come argomenti per i parametri number e date.These examples use different types of expressions as arguments for the number and date parameters. Gli esempi usano il database AdventureWorks.The examples use the AdventureWorks database.

Indicazione di una colonna come dataSpecifying a column as date

In questo esempio vengono aggiunti 2 (due) giorni a ogni valore nella colonna OrderDate per derivare una nuova colonna denominata 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;  

Set di risultati parziale: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  
  

Indicazione di variabili definite dall'utente come argomenti number e dateSpecifying user-defined variables as number and date

In questo esempio vengono specificate variabili definite dall'utente come argomenti per i parametri number e 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);  

Set di risultati:Here is the result set.

-----------------------  
2000-12-31 01:01:01.110  
  
(1 row(s) affected)  

Indicazione di una funzione di sistema scalare come valore dateSpecifying scalar system function as date

Questo esempio specifica SYSDATETIME per date.This example specifies SYSDATETIME for date. Il valore esatto restituito dipende dal giorno e dall'ora di esecuzione dell'istruzione:The exact value returned depends on the day and time of statement execution:

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

Set di risultati:Here is the result set.

---------------------------  
2013-02-06 14:29:59.6727944  
  
(1 row(s) affected)  

Indicazione di sottoquery scalari e funzioni scalari come valori number e dateSpecifying scalar subqueries and scalar functions as number and date

In questo esempio vengono usate sottoquery scalari, MAX(ModifiedDate), come argomenti per number e date.This example uses scalar subqueries, MAX(ModifiedDate), as arguments for number and date. (SELECT TOP 1 BusinessEntityID FROM Person.Person) funge da argomento fittizio perché il parametro number illustri come selezionare un argomento number da un elenco di valori.(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));  

Indicazione di espressioni numeriche e funzioni di sistema scalari come valori number e dateSpecifying numeric expressions and scalar system functions as number and date

Questo esempio usa un'espressione numerica (-(10/2)), operatori unari (-), un operatore aritmetico (/) e funzioni di sistema scalari (SYSDATETIME) come argomenti per number e 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());  

Indicazione di funzioni di rango come argomenti numberSpecifying ranking functions as number

Questo esempio usa una funzione di rango come argomento per 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;  

Indicazione di una funzione finestra di aggregazione come argomento numberSpecifying an aggregate window function as number

Questo esempio usa una funzione finestra di aggregazione come argomento per un parametro 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  

Vedere ancheSee also

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