DATEADD (Transact-SQL)

Applies to: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric の SQL 分析エンドポイント Microsoft Fabric のウェアハウス

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

Transact-SQL のすべての日付と時刻のデータ型と関数の概要については日付と時刻のデータ型と関数に関するページを参照してください。

Transact-SQL 構文表記規則

構文

DATEADD (datepart , number , date )

引数

datepart

DATEADDint numberを追加するdateの部分。 この表には、有効な datepart 引数をすべて一覧表示しています。

Note

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

datepart 省略形
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

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

date

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

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

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

戻り値の型

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

戻り値

datepart 引数

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

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

次に当てはまる場合:

  • datepartmonth
  • date 月の日数が戻り値の月の日数より多い
  • 戻り月に 日が存在しません

DATEADD は、戻り値の月の最後の日を返します。 たとえば、9 月は 30 日 (30 日) です。したがって、これらのステートメントは 2024-09-30 00:00:00.000を返します。

SELECT DATEADD(month, 1, '20240830');
SELECT DATEADD(month, 1, '2024-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, '20240731');
SELECT DATEADD(year, -2147483649, '20240731');

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, '20240731');
SELECT DATEADD(year, -2147483647, '20240731');

smalldatetime 日付と秒または秒の小数部の datepart の戻り値

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

  • seconddatepartと、-30 ~ +29 の数値値の場合、DATEADDは変更されません。

  • datepart secondnumber 値が -30 未満、または +29 を超える場合、DATEADDは 1 分から始まる加算を実行します。

  • milliseconddatepartと -30001 ~ +29998 の数値値の場合、DATEADDは変更されません。

  • datepart millisecondnumber 値が -30001 未満、または +29998 を超える場合、DATEADDは 1 分から加算を実行します。

解説

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

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

秒の小数部の有効桁数

DATEADDでは、date データ型smalldatetimedate、および datetimemicrosecondまたはnanoseconddatepartの追加は許可されません。

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

これらのステートメントは、millisecondmicrosecond、またはnanoseconddatepartを追加します。

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

結果セットは次のとおりです。

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

タイム ゾーン オフセット

DATEADD では、タイム ゾーン オフセットの追加は許可されません。

A. datepart を 1 ずつ増やす

次の各ステートメントは、datepart を 1 単位増やします。

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

結果セットは次のとおりです。

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

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

DECLARE @datetime2 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: 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

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

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

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

結果セットは次のとおりです。

2024-04-25 14:29:59.6727944

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 として数値式やスカラー システム関数を指定する

この例では、数値式 (-(10 / 2))、 非項演算子 (-)、 順序演算子 (/)、スカラー システム関数 (SYSDATETIME) を、 number および date の引数として使用します

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