DATEADD - 日付単位数を日付に加算または日付から減算

DATEADD 関数は、完全な日付構成要素に特定の日付単位数 (例、日数、月数、年数) を加算または減算します。単位は次のいずれかです。

  • 月   月単位を使用する計算が無効な日付を作成する場合、DATEADD は、この日付を月の最終日に修正します。たとえば、10 月 31 日に 1 か月を加算すると、11 月は 30 日間であるため、11 月 30 日になります。
  • 平日   平日単位を使用すると、DATEADD は土曜日と日曜日を計算しません。たとえば、金曜日に 1 日を追加すると、結果は月曜日になります。
  • 営業日   営業日単位を使用すると、DATEADD は BUSDAYS パラメータおよび祝日ファイルにより、営業日を決定します。これ以外は無視されます。月曜日が営業日でない場合、日曜日の次の営業日は火曜日になります。詳細は、標準日付関数の使用を参照してください。

DATEADD 関数が次の営業日または前の営業日を計算する場合、常に営業日を基準に計算を開始します。そのため、実際の日が土曜日または日曜日の場合に、リクエストで次の営業日を計算すると、この関数は土曜日または日曜日の代わりに月曜日を開始日として使用し、次の営業日として火曜日を返します。同様に、前の営業日を計算する際は、開始日として金曜日を使用し、前の営業日として木曜日を返します。DATEADD 関数を使用する前に、DATEMOV 関数を使用することで、日付を正しい営業日に移動することができます。詳細は、DATEMOV - 日付を指定の位置に移動を参照してください。

DATEADD 関数で使用する日付は、日付フォーマットである必要があります。ダイアログマネージャでは日付が文字または数値として解釈され、また DATEADD 関数では基準日からのオフセットとして格納された標準日付を使用する必要があることから、ダイアログマネージャでは DATEADD 関数を使用しないでください。ただし、入力日付として使用する変数を、基準日からのオフセットに事前に変換した場合を除きます。

詳細は、ダイアログマネージャコマンドからの関数の呼び出しを参照してください。

日を基準としない日付 (例、YM または YQ) の和または差の計算は、DATEADD 関数を使用せずに、直接実行してください。

DATEADD 関数は、年月日を含む完全な日付形式でのみ有効です。

日付単位数を日付に加算または日付から減算

DATEADD(date, 'component', increment)

説明

date

日付

年月日を含む完全な日付形式です。

component

文字

次のいずれかを一重引用符 (') で囲んで指定します。

Y - 構成要素「年」を示します。

M - 構成要素「月」を示します。

D - 構成要素「日」を示します。

WD - 構成要素「平日」を示します。

BD - 構成要素「営業日」を示します。

increment

整数

date で指定した日付に加算する、または日付から減算する日付単位数です。この単位数が整数でない場合、小数点以下が切り捨てられて次に大きい整数になります。

注意:DATEADD では output 引数は使用されません。この関数の結果には、date 引数のフォーマットが使用されます。結果が完全構成要素の日付である限り、完全構成要素の日付フィールドまたは整数フィールドのみに割り当てることができます。

DATEADD による切り捨て

DATEADD に渡される単位数は、常に整数です。以下はその例です。

DATEADD(DATE, 'M', 1.999)

上記の例では、単位数が 2 未満であるため、1 か月加算されます。

平日単位の使用

平日単位を使用しており、土曜日または日曜日が入力日付である場合、DATEADD は入力日付を月曜日に変更します。関数は以下のようになります。

DATEADD('910623', 'WD', 1)

上記の関数では、土曜日または日曜日である DATE は火曜日になります。土曜日と日曜日は平日ではないため、DATEADD は平日の開始日である月曜日に 1 を加算します。

最初の引数を一重引用符で囲むと (‘910623’)、自然言語の日付リテラルとして処理されます。

日付に平日を追加

DATEADD は、平日 3 日を NEW_DATE に追加します。3 日追加すると HIRE_DATE_PLUS_THREE が週末になることがあるため、4 日以上追加する場合があります。

TABLE FILE EMPLOYEE
PRINT FIRST_NAME AND HIRE_DATE AND COMPUTE
NEW_DATE/YYMD = HIRE_DATE;
HIRE_DATE_PLUS_THREE/YYMD = DATEADD(NEW_DATE, 'WD', 3);
BY LAST_NAME
WHERE DEPARTMENT EQ 'MIS';
END

出力結果は次のとおりです。

LAST_NAME     FIRST_NAME  HIRE_DATE  NEW_DATE    HIRE_DATE_PLUS_THREE
---------     ----------  ---------  --------    --------------------
BLACKWOOD     ROSEMARIE    82/04/01  1982/04/01  1982/04/06
CROSS         BARBARA      81/11/02  1981/11/02  1981/11/05
GREENSPAN     MARY         82/04/01  1982/04/01  1982/04/06
JONES         DIANE        82/05/01  1982/05/01  1982/05/06
MCCOY         JOHN         81/07/01  1981/07/01  1981/07/06
SMITH         MARY         81/07/01  1981/07/01  1981/07/06

営業日を決定

DATEADD は、営業日単位を使用して、TRANSDATE フィールドに 0 (ゼロ) 日加算することにより、TRANSDATE フィールドの営業日ではない値を決定します。TRANSDATE が営業日ではない場合、DATEADD 関数は DATEX に次の営業日を返します。TRANSDATE が DATEX と比較され、これら 2 つのフィールド間で一致しないすべての日付の曜日が出力されます。その結果、営業日ではない日のリストが生成されます。

DEFINE FILE VIDEOTRK
DATEX/YMD  = DATEADD(TRANSDATE, 'BD', 0);
DATEINT/I8YYMD = DATECVT(TRANSDATE, 'YMD','I8YYMD');
END
TABLE FILE VIDEOTRK
SUM TRANSDATE NOPRINT
COMPUTE DAYNAME/A8 = DOWKL(DATEINT, DAYNAME); AS 'Day of Week'
BY TRANSDATE AS 'Date'
WHERE TRANSDATE NE DATEX
END

出力結果は次のとおりです。

Date      Day of Week 
----      ----------- 
91/06/22  SATURDAY
91/06/23  SUNDAY
91/06/30  SUNDAY