DATEADD (Transact-SQL)

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

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

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

Transact-SQL 構文表記規則

構文

DATEADD (datepart , number , date )

Note

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

引数

datepart

整数を加算するDATEADD日付部分。 この表には、有効な 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

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

戻り値の型

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

戻り値

datepart 引数

dayofyearを選択 dayし、 weekday 同じ値を返します。

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

次に当てはまる場合:

  • datepart is month
  • 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 引数

引数 numberint範囲を超えることはできません。次のステートメントでは、数値引数が 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 値に加算された 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 です。 smalldatetimedate 値の場合、次が適用されます。

  • datepartsecond場合、および -30 ~ +29 の数値の場合、DATEADD変更は行われません。

  • datepartsecond場合、および -30 より小さい数値、または +29 を超える数値では、 DATEADD 1 分から始まる加算が実行されます。

  • 日付部分millisecond-30001 ~ +29998 の数値の場合、DATEADD変更は行われません。

  • 日付部分millisecond-30001 より小さい数値、または +29998 を超える場合は、 DATEADD 1 分から始まる加算を実行します。

解説

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

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

秒の小数部の有効桁数

DATEADDでは、smalldatetime、datemicroseconddatetime の日付型またはnanosecond日付データ型に対する追加は許可されません。

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

これらのステートメントでは、datepart追加microsecondしますnanosecondmillisecond

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, 365, @datetime2); --2025-01-01 01:01:01.1111111
SELECT DATEADD(day, 365, @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) を使用します。-

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