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 のウェアハウス
この関数によって、入力された date の datepart に number (符号付き整数) が追加され、変更された日時の値が返されます。 たとえば、この関数を使用すると、今日から 7,000 分の日付 ( number = 7000、 datepart = minute、 date = today) を検索できます。
Transact-SQL のすべての日付と時刻のデータ型と関数の概要については日付と時刻のデータ型と関数に関するページを参照してください。
構文
DATEADD (datepart , number , date )
引数
datepart
DATEADD
がint 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
によって追加される int を date の datepart に解決できる式。 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 引数
dayofyear
、 day
、および weekday
は同じ値を返します。
-各日付構成要素とその省略形は、同じ値を返します。
次に当てはまる場合:
- datepart は
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 引数
引数 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 値の場合、次が適用されます。
second
のdatepartと、-30 ~ +29 の数値値の場合、DATEADD
は変更されません。datepart
second
、number 値が -30 未満、または +29 を超える場合、DATEADD
は 1 分から始まる加算を実行します。millisecond
のdatepartと -30001 ~ +29998 の数値値の場合、DATEADD
は変更されません。datepart
millisecond
と number 値が -30001 未満、または +29998 を超える場合、DATEADD
は 1 分から加算を実行します。
解説
次の句で DATEADD
を使用します。
GROUP BY
HAVING
ORDER BY
SELECT <list>
WHERE
秒の小数部の有効桁数
DATEADD
では、date データ型smalldatetime、date、および datetime のmicrosecond
またはnanosecond
のdatepartの追加は許可されません。
ミリ秒の小数点以下桁数は 3 (.123
)、マイクロ秒の小数点以下桁数は 6 (.123456
)、ナノ秒の小数点以下桁数は 9 (.123456789
) です。 time、datetime2、および datetimeoffset データ型の最大スケールは 7 (.1234567
) です。 nanosecond
のdatepartの場合、数値は、date の小数部の秒の前に 100 にする必要があります。 1 から 49 までの数値は 0 に切り捨て、50 から 99 の数値は 100 に切り上げされます。
これらのステートメントは、millisecond
、microsecond
、またはnanosecond
のdatepartを追加します。
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 を複数ずつ増やす
次の各ステートメントは、date の datepart を付加的に繰り上げる 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 にユーザー定義変数を指定する
次の例では、number と date の引数としてユーザー定義変数を指定しています。
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 として指定する
この例では、date の SYSDATETIME
を指定しています。 返される厳密な値は、ステートメント実行の日時によって変わります。
SELECT DATEADD(month, 1, SYSDATETIME());
結果セットは次のとおりです。
2024-04-25 14:29:59.6727944
number および date にスカラー サブクエリやスカラー関数を指定する
次の例では、number と date の引数として、スカラー サブクエリ (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