DATEADD (Transact-SQL)
適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
この関数によって、入力された date の datepart に number (符号付き整数) が追加され、変更された日時の値が返されます。 たとえば、この関数を使用すると、今日から 7,000 分間後の日付 (number = 7,000、datepart = 分、date = 今日) がわかります。
Transact-SQL の日付と時刻のデータ型および関数の概要については、「日付と時刻のデータ型および関数 (Transact-SQL)」を参照してください。
構文
DATEADD (datepart , number , date )
Note
SQL Server 2014 以前の Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。
引数
datepart
DATEADD
によって integernumber が追加される date のパーツ。 この表には、有効な datepart 引数をすべて一覧表示しています。
注意
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 値に切り捨てを行います。 この状況で 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 引数
dayofyear、day、および weekday は同じ値を返します。
-各日付構成要素とその省略形は、同じ値を返します。
次に当てはまる場合:
- datepart が month である
- 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 値の場合、次が適用されます。
- second の datepart と -30 から +29 の number 値の場合、
DATEADD
によって変更が行われることはありません。 - second の datepart と、-30 未満、+29 超の number 値の場合、
DATEADD
は 1 分から始まる加算を実行します。 - millisecond の datepart と -30001 から +29998 の number 値の場合、
DATEADD
によって変更が行われることはありません。 - second の datepart と、-30001 未満、+29998 超の number 値の場合、
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 の 1 秒未満の秒を増やす前に、number を 100 にする必要があります。 1 から 49 の number は 0 に切り捨てられ、50 から 99 は 100 に切り上げられます。
次のステートメントは、millisecond、microsecond、または nanosecond の datepart を加算します。
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 を複数レベル増やす
次の各ステートメントは、date の datepart を付加的に繰り上げる 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 にユーザー定義変数を指定する
次の例では、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
(1 row(s) affected)
スカラー システム関数を date として指定する
この例では、date の SYSDATETIME
を指定しています。 返される厳密な値は、ステートメント実行の日時によって変わります。
SELECT DATEADD(month, 1, SYSDATETIME());
結果セットは次のようになります。
---------------------------
2013-02-06 14:29:59.6727944
(1 row(s) affected)
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 として数値式やスカラー システム関数を指定する
次の例では、number と date の引数として、数値式 (-(10/2))
、単項演算子 (-
)、算術演算子 (/
)、スカラー システム関数 (SYSDATETIME
) を使用しています。
SELECT DATEADD(month,-(10/2), SYSDATETIME());
number として順位付け関数を指定する
次の例では、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