次の方法で共有


DATEADD (Transact-SQL)

Applies to:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics 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

DATEADDnumberを追加するdateの部分。

Microsoft Fabric の Azure SQL Database、Azure SQL Managed Instance、SQL データベースでは、 数値bigint として表すことができます。 この機能はプレビュー段階にあります。

この表には、有効な 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

番号

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

Microsoft Fabric の Azure SQL Database と SQL データベースでは、 数値bigint として表すことができます。 この機能はプレビュー段階にあります。

日付

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

  • 日付
  • datetime
  • datetimeoffset
  • datetime2
  • smalldatetime (スモールデイトタイム)
  • 時間

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

戻り値の型

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

戻り値

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 の範囲を超えています。

SELECT DATEADD(year, 2147483648, '20240731');
SELECT DATEADD(year, -2147483649, '20240731');

これらのステートメントはどちらも、次のエラー メッセージを返します。

Msg 8115, Level 16, State 2, Line 1. Arithmetic overflow error converting expression to data type int.

Microsoft Fabric の Azure SQL Database と SQL データベースでは、 数値bigint として表すことができます。 この機能はプレビュー段階にあります。

date 引数

DATEADD では、 date データ型の範囲外の値にインクリメントされる引数は受け入れられません。 次のステートメントでは、date 値に加算された number 値は date データ型の範囲を超えています。

SELECT DATEADD(year, 2147483647, '20240731');
SELECT DATEADD(year, -2147483647, '20240731');

DATEADD は、次のエラー メッセージを返します。

Msg 517, Level 16, State 1, Line 1 Adding a value to a 'datetime' column caused overflow.

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

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

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

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

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

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

解説

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

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

秒の小数部の有効桁数

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

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

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

DECLARE @datetime2 AS 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 AS 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. 1 つのステートメントで複数レベルの datepart をインクリメントする

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

DECLARE @datetime2 AS 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 として指定する

次の例では、2 列の各値に OrderDate 日を加算し、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 AS INT = 365,
    @datetime AS 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 として指定する

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

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

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

2024-04-25 14:29:59.6727944

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

次の例では、MAX(ModifiedDate)date の引数として、スカラー サブクエリ () を使用しています。 (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