DATEADD (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric の SQL 分析エンドポイントMicrosoft Fabric のウェアハウス

この関数によって、入力された datedatepartnumber (符号付き整数) が追加され、変更された日時の値が返されます。 たとえば、この関数を使用すると、今日から 7,000 分間後の日付 (number = 7,000、datepart = 分、date = 今日) がわかります。

Transact-SQL の日付と時刻のデータ型および関数の概要については、「日付と時刻のデータ型および関数 (Transact-SQL)」を参照してください。

Transact-SQL 構文表記規則

構文

DATEADD (datepart , number , date )

Note

SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。

引数

datepart

DATEADD によって integernumber が追加される date のパーツ。 この表には、有効な datepart 引数をすべて一覧表示しています。

注意

DATEADD は、datepart 引数に関して、ユーザー定義変数に相当するものは受け入れられません。

datepart 省略形
year yyyyyy
quarter qqq
month mmm
dayofyear dyy
day ddd
week wkww
weekday dww
hour hh
minute min
second sss
millisecond ms
microsecond mcs
nanosecond ns

number

DATEADD によって追加される intdatedatepart に解決できる式。 DATEADD は、number に関してユーザー定義の変数値を受け取ります。 DATEADD は、小数を持つ指定 number 値に切り捨てを行います。 この状況で number 値が丸められることはありません。

date

次のいずれかの値に解決できる式。

  • date
  • datetime
  • datetimeoffset
  • datetime2
  • smalldatetime
  • time

date の場合、DATEADD では、列式、式、文字列リテラル、ユーザー定義の変数が受け入れられます。 文字列リテラル値は datetime に解決する必要があります。 あいまいさの問題を排除するために、4 桁の西暦を使用してください。 2 桁の西暦については、「two digit year cutoff サーバー構成オプションの構成」を参照してください。

戻り値の型

このメソッドの戻り値のデータ型は動的です。 戻り値の型は、date に与えられた引数によって異なります。 date の値が文字列リテラル日付であれば、DATEADD からは datetime 値が返されます。 別の有効な入力データ型が date に指定された場合、DATEADD からは同じデータ型が返されます。 DATEADD は、文字列リテラルの秒の小数点以下桁数 (.nnn) が 3 を超えるか、文字列リテラルにタイム ゾーン オフセット部分が含まれる場合、エラーを出します。

戻り値

datepart 引数

dayofyearday、および weekday は同じ値を返します。

-各日付構成要素とその省略形は、同じ値を返します。

次に当てはまる場合:

  • datepartmonth である
  • date 月の日数が戻り値の月の日数より多い
  • date 日が戻り値の月に存在しない

DATEADD は、戻り値の月の最後の日を返します。 たとえば、9 月の日数が 30 日なので、次のステートメントは、2006-09-30 00:00:00.000 を返します。

SELECT DATEADD(month, 1, '20060830');
SELECT DATEADD(month, 1, '2006-08-31');

number 引数

number 引数は、int の範囲を超えることはできません。次のステートメントでは、number の引数が int の範囲を 1 超えています。 これらのステートメントはいずれも次のエラー メッセージを返します: 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 引数

DATEADD は、そのデータ型の範囲を超える値まで増える date 引数を受け取りません。 次のステートメントでは、date 値に加算された number 値は date データ型の範囲を超えています。 DATEADD は次のエラー メッセージを返します: 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 秒未満の秒)

smalldatetime 値の秒の部分は常に 00 です。 smalldatetimedate 値の場合、次が適用されます。

  • seconddatepart と -30 から +29 の number 値の場合、DATEADD によって変更が行われることはありません。
  • seconddatepart と、-30 未満、+29 超の number 値の場合、DATEADD は 1 分から始まる加算を実行します。
  • milliseconddatepart と -30001 から +29998 の number 値の場合、DATEADD によって変更が行われることはありません。
  • seconddatepart と、-30001 未満、+29998 超の number 値の場合、DATEADD は 1 分から始まる加算を実行します。

解説

次の句で DATEADD を使用します。

  • GROUP BY
  • HAVING
  • ORDER BY
  • SELECT <list>
  • WHERE

秒の小数部の有効桁数

DATEADD は、date データ型の smalldatetimedatedatetime について、microsecond または nanoseconddatepart に加算を許可しません。

ミリ秒の小数点以下桁数は 3 (.123) です。マイクロ秒の小数点以下桁数は 6 (.123456) です。ナノ秒の小数点以下桁数は 9 (.123456789) です。 timedatetime2、およびdatetimeoffset データ型の小数点以下桁数は最大 7 (.1234567) です。 nanoseconddatepart については、date の 1 秒未満の秒を増やす前に、number を 100 にする必要があります。 1 から 49 の number は 0 に切り捨てられ、50 から 99 は 100 に切り上げられます。

次のステートメントは、millisecondmicrosecond、または nanoseconddatepart を加算します。

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);  

結果セットは次のようになります。

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  

タイム ゾーン オフセット

DATEADD は、タイム ゾーン オフセットの加算を許可しません。

A. datepart を 1 ずつ増やす

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

結果セットは次のようになります。

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. 単一のステートメントで datepart を複数ずつ増やす

次の各ステートメントは、datedatepart を付加的に繰り上げる number だけ datepart を増やします。

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: number パラメーターと date パラメーターの引数として式を使用する

次の例では、number パラメーターと date パラメーターの引数として、さまざまな種類の式を使用しています。 使用例では、AdventureWorks データベースを使用します。

列を date として指定する

次の例では、OrderDate 列の各値に 2 日を加算し、PromisedShipDate という名前の新しい列を作成します。

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

次に結果セットの一部を示します。

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 にユーザー定義変数を指定する

次の例では、numberdate の引数としてユーザー定義変数を指定しています。

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

結果セットは次のようになります。

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

スカラー システム関数を date として指定する

この例では、dateSYSDATETIME を指定しています。 返される厳密な値は、ステートメント実行の日時によって変わります。

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

結果セットは次のようになります。

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

number および date にスカラー サブクエリやスカラー関数を指定する

次の例では、numberdate の引数として、スカラー サブクエリ (MAX(ModifiedDate)) を使用しています。 (SELECT TOP 1 BusinessEntityID FROM Person.Person) は、値リストから number 引数を選択する方法を紹介するために用意した、数値パラメーターの架空の引数です。

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

number および date として数値式やスカラー システム関数を指定する

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

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

数値として順位付け関数を指定する

次の例では、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 として集計関数を指定する

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