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

適用対象: ○SQL Server ○Azure SQL Database ○Azure SQL Data Warehouse ○Parallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

この関数は、入力 date 値の指定 datepart に指定 number 値 (符号付き整数として) を追加し、その変更後の値を返します。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.

Transact-SQLTransact-SQL の日付と時刻のあらゆるデータ型と関数に関する概要については、「日付と時刻のデータ型および関数 (Transact-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.

トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions

構文Syntax

DATEADD (datepart , number , date )  

引数Arguments

datepartdatepart
DATEADD によって integer number が追加される date のパーツ。The part of date to which DATEADD adds an integer number. この表には、有効な datepart 引数をすべて一覧表示しています。This table lists all valid datepart arguments.

注意

DATEADD は、datepart 引数に関して、ユーザー定義変数に相当するものは受け入れられません。DATEADD does not accept user-defined variable equivalents for the datepart arguments.

datepartdatepart 省略形Abbreviations
yearyear yyyyyyyy, yyyy
quarterquarter qqqqq, q
monthmonth mmmmm, m
dayofyeardayofyear dyydy, y
dayday ddddd, d
weekweek wkwwwk, ww
weekdayweekday dwwdw, w
hourhour hhhh
minuteminute minmi, n
secondsecond sssss, s
millisecondmillisecond msms
microsecondmicrosecond mcsmcs
nanosecondnanosecond nsns

numbernumber
DATEADD によって追加される intdatedatepart に解決できる式。An expression that can resolve to an int that DATEADD adds to a datepart of date. DATEADD は、number に関してユーザー定義の変数値を受け取ります。DATEADD accepts user-defined variable values for number. DATEADD は、小数を持つ指定 number 値に切り捨てを行います。DATEADD will truncate a specified number value that has a decimal fraction. この状況で number 値が丸められることはありません。It will not round the number value in this situation.

datedate
次のいずれかの値に解決できる式。An expression that can resolve to one of the following values:

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

date の場合、DATEADD では、列式、式、文字列リテラル、ユーザー定義の変数が受け入れられます。For date, DATEADD will accept a column expression, expression, string literal, or user-defined variable. 文字列リテラル値は datetime に解決する必要があります。A string literal value must resolve to a datetime. あいまいさの問題を排除するために、4 桁の西暦を使用してください。Use four-digit years to avoid ambiguity issues. 2 桁の西暦については、「two digit year cutoff サーバー構成オプションの構成」を参照してください。See Configure the two digit year cutoff Server Configuration Option for information about two-digit years.

戻り値の型Return types

このメソッドの戻り値のデータ型は動的です。The return value data type for this method is dynamic. 戻り値の型は、date に与えられた引数によって異なります。The return type depends on the argument supplied for date. date の値が文字列リテラル日付であれば、DATEADD からは datetime 値が返されます。If the value for date is a string literal date, DATEADD returns a datetime value. 別の有効な入力データ型が date に指定された場合、DATEADD からは同じデータ型が返されます。If another valid input data type is supplied for date, DATEADD returns the same data type. DATEADD は、文字列リテラルの秒の小数点以下桁数 (.nnn) が 3 を超えるか、文字列リテラルにタイム ゾーン オフセット部分が含まれる場合、エラーを出します。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.

戻り値Return Value

datepart 引数datepart Argument

dayofyearday、および weekday は同じ値を返します。dayofyear, day, and weekday return the same value.

-各日付構成要素とその省略形は、同じ値を返します。Each datepart and its abbreviations return the same value.

次に当てはまる場合:If the following are true:

  • datepartmonth であるdatepart is month
  • date 月の日数が戻り値の月の日数より多いthe date month has more days than the return month
  • date 日が戻り値の月に存在しないthe date day does not exist in the return month

DATEADD は、戻り値の月の最後の日を返します。Then, DATEADD returns the last day of the return month. たとえば、9 月の日数が 30 日である場合、次のステートメントは、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');

number 引数number Argument

number 引数は、int の範囲を超えることはできません。次のステートメントでは、number の引数が int の範囲を 1 超えています。The number argument cannot exceed the range of int. In the following statements, the argument for number exceeds the range of int by 1. これらのステートメントはいずれも次のエラー メッセージを返します。 "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');  

date 引数date Argument

DATEADD は、そのデータ型の範囲を超える値まで増える date 引数を受け取りません。DATEADD will not accept a date argument incremented to a value outside the range of its data type. 次のステートメントでは、date 値に加算された number 値は date データ型の範囲を超えています。In the following statements, the number value added to the date value exceeds the range of the date data type. DATEADD は次のエラー メッセージを返します。 "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');  

smalldatetime に対する戻り値 (日付および秒または 1 秒未満の秒)Return Values for a smalldatetime date and a second or Fractional Seconds datepart

smalldatetime 値の秒の部分は常に 00 です。The seconds part of a smalldatetime value is always 00. smalldatetime date 値の場合、次が適用されます。For a smalldatetime date value, the following apply:

  • seconddatepart と -30 から +29 の number 値の場合、DATEADD によって変更が行われることはありません。For a datepart of second, and a number value between -30 and +29, DATEADD makes no changes.
  • seconddatepart と、-30 未満、+29 超の number 値の場合、DATEADD は 1 分から始まる加算を実行します。For a datepart of second, and a number value less than -30, or more than +29, DATEADD performs its addition beginning at one minute.
  • milliseconddatepart と -30001 から +29998 の number 値の場合、DATEADD によって変更が行われることはありません。For a datepart of millisecond and a number value between -30001 and +29998, DATEADD makes no changes.
  • seconddatepart と、-30001 未満、+29998 超の number 値の場合、DATEADD は 1 分から始まる加算を実行します。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

次の句で DATEADD を使用します。Use DATEADD in the following clauses:

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

秒の小数部の有効桁数Fractional seconds precision

DATEADD は、date データ型の smalldatetimedatedatetime について、microsecond または nanoseconddatepart に加算を許可しません。DATEADD does not allow addition for a datepart of microsecond or nanosecond for date data types smalldatetime, date, and datetime.

ミリ秒の小数点以下桁数は 3 (.123) です。マイクロ秒の小数点以下桁数は 6 (.123456) です。ナノ秒の小数点以下桁数は 9 (.123456789) です。Milliseconds have a scale of 3 (.123), microseconds have a scale of 6 (.123456), and nanoseconds have a scale of 9 (.123456789). timedatetime2、およびdatetimeoffset データ型の小数点以下桁数は最大 7 (.1234567) です。The time, datetime2, and datetimeoffset data types have a maximum scale of 7 (.1234567). nanoseconddatepart については、date の 1 秒未満の秒を増やす前に、number を 100 にする必要があります。For a datepart of nanosecond, number must be 100 before the fractional seconds of date increase. 1 から 49 の number は 0 に切り捨てられ、50 から 99 は 100 に切り上げられます。A number between 1 and 49 will round down to 0, and a number from 50 to 99 rounds up to 100.

次のステートメントは、millisecondmicrosecond、または nanoseconddatepart を加算します。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);  

以下に結果セットを示します。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  

タイム ゾーン オフセットTime zone offset

DATEADD は、タイム ゾーン オフセットの加算を許可しません。DATEADD does not allow addition for time zone offset.

使用例Examples

A.A. datepart を 1 単位増やすIncrementing datepart by an interval of 1

次の各ステートメントは、datepart を 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);  

以下に結果セットを示します。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. 単一のステートメントで datepart を複数レベル増やすIncrementing more than one level of datepart in one statement

次の各ステートメントは、datedatepart を付加的に繰り上げる number だけ datepart を増やします。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. number パラメーターと date パラメーターの引数として式を使用するUsing expressions as arguments for the number and date parameters

次の例では、number パラメーターと date パラメーターの引数として、さまざまな種類の式を使用しています。These examples use different types of expressions as arguments for the number and date parameters. 使用例では、AdventureWorks データベースを使用します。The examples use the AdventureWorks database.

列を date として指定するSpecifying a column as date

次の例では、OrderDate 列の各値に 2 日を加算し、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;  

次に結果セットの一部を示します。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  
  

number および date にユーザー定義変数を指定するSpecifying user-defined variables as number and date

次の例では、numberdate の引数としてユーザー定義変数を指定しています。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);  

以下に結果セットを示します。Here is the result set.

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

スカラー システム関数を date として指定するSpecifying scalar system function as date

この例では、dateSYSDATETIME を指定しています。This example specifies SYSDATETIME for date. 返される厳密な値は、ステートメント実行の日時によって変わります。The exact value returned depends on the day and time of statement execution:

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

以下に結果セットを示します。Here is the result set.

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

number および date にスカラー サブクエリやスカラー関数を指定するSpecifying scalar subqueries and scalar functions as number and date

次の例では、numberdate の引数として、スカラー サブクエリ (MAX(ModifiedDate)) を使用しています。This example uses scalar subqueries, MAX(ModifiedDate), as arguments for number and date. (SELECT TOP 1 BusinessEntityID FROM Person.Person) は、値リストから number 引数を選択する方法を紹介するために用意した、数値パラメーターの架空の引数です。(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));  

number および date として数値式やスカラー システム関数を指定するSpecifying numeric expressions and scalar system functions as number and date

次の例では、numberdate の引数として、数値式 (-(10/2))単項演算子 (-)、算術演算子 (/)、スカラー システム関数 (SYSDATETIME) を使用しています。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());  

number として順位付け関数を指定するSpecifying ranking functions as number

次の例では、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;  

number として集計関数を指定するSpecifying an aggregate window function as number

次の例では、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  

参照See also

CAST および CONVERT (Transact-SQL)CAST and CONVERT (Transact-SQL)