次の方法で共有


DATEADD (Transact-SQL)

number に指定された間隔 (符号付き整数) を加算した date を返します。この間隔は、指定した date の datepart に加算されます。

Transact-SQL の日付と時刻のデータ型および関数の概要については、「日付と時刻のデータ型および関数 (Transact-SQL)」を参照してください。

トピック リンク アイコン Transact-SQL 構文表記規則

構文

DATEADD (datepart , number , date )

引数

  • datepart
    integer 型の number を、date のどの構成要素に加算するかを指定します。 次の表は、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
    date の datepart に加算する値として、int 型に解決可能な式を指定します。 ユーザー定義型の変数は有効です。

    小数を含む値を指定した場合、小数部は丸められずに切り捨てられます。

  • date
    time、date、smalldatetime、datetime、datetime2、datetimeoffset のいずれかの値に解決可能な式を指定します。 date には、式、列式、ユーザー定義変数、または文字列リテラルを指定できます。 式が文字列リテラルの場合は、datetime に解決する必要があります。 このあいまいな状態を避けるためには、4 桁の西暦を使用して表記します。 2 桁の年の詳細については、「two digit year cutoff サーバー構成オプションの構成」を参照してください。

戻り値の型

文字列リテラルを除き、戻り値のデータ型は、date 引数のデータ型になります。

文字列リテラルの戻り値のデータ型は datetime です。 文字列リテラルの秒の小数点以下桁数が 3 桁 (. nnn) を超えた場合またはタイム ゾーン オフセット部分を含んでいた場合、エラーが発生します。

datepart 引数

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

いずれの datepart も、対応する省略形を指定すると、同じ値が返されます。

datepart に month を指定したとき、date の月の日数が、戻り値の月の日数を超えていて、date の日が戻り値の月に存在しない場合、戻り値の月の最後の日が返されます。 たとえば、9 月の日数が 30 日である場合、次の 2 つのステートメントは、2006-09-30 00:00:00.000 を返します。

SELECT DATEADD(month, 1, '2006-08-30');

SELECT DATEADD(month, 1, '2006-08-31');

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, '2006-07-31');
SELECT DATEADD(year,-2147483649, '2006-07-31');

date 引数を、そのデータ型の範囲外の値に増やすことはできません。 次のステートメントでは、date 値に加算される number 値が、date データ型の範囲を超えています。 "Msg 517, Level 16, State 1, Line 1 Adding a value to a 'datetime' column caused overflow" というエラー メッセージが返されます。

SELECT DATEADD(year,2147483647, '2006-07-31');
SELECT DATEADD(year,-2147483647, '2006-07-31');

smalldatetime 値の秒要素は常に 00 になります。 date が smalldatetime の場合、次の規則が適用されます。

  • datepart が second で、number が -30 ~ +29 である場合、加算処理は実行されません。

  • datepart が second で、number が -30 より小さく +29 より大きい場合、加算処理は 1 分から実行されます。

  • datepart が millisecond で、number が -30001 ~ +29998 である場合、加算処理は実行されません。

  • datepart が millisecond で、number が -30001 より小さく +29998 より大きい場合、加算処理は 1 分から実行されます。

説明

DATEADD は、SELECT <list> のほか、WHERE 句、HAVING 句、GROUP BY 句、および ORDER BY 句で使用できます。

1 秒未満の秒の有効桁数

date のデータ型が smalldatetime、date、datetime のいずれかである場合、datepart を microsecond や nanosecond にして加算処理を行うことはできません。

ミリ秒の小数点以下桁数は 3 (.123) です。マイクロ秒の小数点以下桁数は 6 (.123456) です。ナノ秒の小数点以下桁数は 9 (.123456789) です。 time、datetime2、datetimeoffset の各データ型の最大小数点以下桁数は 7 (.1234567) です。 datepart が nanosecond である場合、date の 1 秒未満の秒を増やす前に、number を 100 にする必要があります。 number に 1 ~ 49 の値を指定した場合、値は 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

タイム ゾーン オフセット

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

使用例

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 を複数単位増やす

次の各ステートメントでは、number を、上位の datepart への繰り上がりが生じる程度に大きくとって、date の 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.110
SELECT DATEADD(month,13,@datetime2);      --2008-02-01 01:01:01.110
SELECT DATEADD(dayofyear,365,@datetime2); --2008-01-01 01:01:01.110
SELECT DATEADD(day,365,@datetime2);       --2008-01-01 01:01:01.110
SELECT DATEADD(week,5,@datetime2);        --2007-02-05 01:01:01.110
SELECT DATEADD(weekday,31,@datetime2);    --2007-02-01 01:01:01.110
SELECT DATEADD(hour,23,@datetime2);       --2007-01-02 00:01:01.110
SELECT DATEADD(minute,59,@datetime2);     --2007-01-01 02:00:01.110
SELECT DATEADD(second,59,@datetime2);     --2007-01-01 01:02:00.110
SELECT DATEADD(millisecond,1,@datetime2); --2007-01-01 01:01:01.110

C. number パラメーターと date パラメーターの引数として式を使用する

次の例では、number パラメーターと date パラメーターの引数としてさまざまな種類の式を使用しています。

列を date として指定する

次の例では、OrderDate 列の各値に 2 日を加算し、PromisedShipDate という名前の新しい列を作成します。

USE AdventureWorks2012;
GO
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 引数を選択する方法を紹介するために用意した架空の引数です。

USE AdventureWorks2012;
GO
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 の引数として順位付け関数を使用しています。

USE AdventureWorks2012;
GO
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 の引数として集計関数を使用しています。

USE AdventureWorks2012;
GO
SELECT SalesOrderID, ProductID, OrderQty
    ,DATEADD(day,SUM(OrderQty) 
        OVER(PARTITION BY SalesOrderID),SYSDATETIME()) AS 'Total'
FROM Sales.SalesOrderDetail 
WHERE SalesOrderID IN(43659,43664);
GO

関連項目

参照

CAST および CONVERT (Transact-SQL)