前のページ|次のページ

INTNX関数

指定した時間間隔で日付、時間または日時の値を増分し、日付、時間または日時の値を返します。

カテゴリ: 日付と時間

構文

INTNX(custom-interval, start-from, increment <, 'alignment'>)

必須引数

interval

WEEK、SEMIYEAR、QTR、HOURなどの時間間隔が含まれる文字定数、変数または式を指定します。Intervalは、大文字または小文字で表示できます。intervalに使用可能な値のリストについては、Intervals Used with Date and Time Functions (SAS言語リファレンス: 解説編)を参照してください。

ヒント
間隔の種類(日付、日時または時間)は、start-fromの値の種類と一致する必要があります。
より複雑な間隔を指定するには、基本間隔名に乗数とシフトインデックスを組み合わせて使用できます。間隔名の一般的な形式を次に示します。

interval<multiple.shift-index>

間隔名の3つの部分は次のとおりです。

interval

基本間隔の種類の名前を指定します。たとえば、YEARで年間隔を指定します。

multiple

乗数を指定します(省略可能)。基本タイプの間隔の期間に対する倍数と同等の間隔を設定します。たとえば、間隔YEAR2は2年の期間の間隔、つまり隔年です。

参照項目 乗数とシフト間隔を使用した日時の増分 詳細については、を参照してください。

shift-index

シフトインデックスを指定します(省略可能)。間隔の開始時点を指定したサブ期間にシフトします。たとえば、YEAR.3で、各カレンダ年の3月1日に開始して翌年の2月末に終了するようにシフトされた年間隔を指定します。

制限事項 シフトインデックスは、間隔全体のサブ期間の数以下にする必要があります。たとえば、2年間隔では25番目の月は存在しないため、YEAR2.24は使用できますがYEAR2.25はエラーになります。
デフォルトのシフト期間が間隔の種類と同じ場合、複数期間の間隔のみを任意のシフトインデックスでシフトできます。たとえば、MONTHの種類の間隔はデフォルトではMONTHのサブ期間でシフトします。そのため、シフトインデックスで月間隔はシフトできません。ただし、各MONTH2間隔には2つのMONTH間隔が含まれるため、シフトインデックスで2か月間隔をシフトできます。たとえば、間隔名MONTH2.2で、偶数月の1日目に開始する2か月の期間を指定します。
参照項目 乗数とシフト間隔を使用した日時の増分 詳細については、を参照してください。

start-from

開始点を識別するSAS日付、時間または日時の値を表すSAS式を指定します。

increment

日付、時間または日時の間隔を表す負、正またはゼロの整数を指定します。Incrementは、start-fromの値をシフトする間隔数です。

オプション引数

'alignment'

間隔内のSAS日付の位置を制御します。alignmentは引用符で囲む必要があります。Alignmentには次のいずれかの値を指定できます。

BEGINNING

返された日付値または日時値を間隔の開始点に配置するように指定します。

別名 B

MIDDLE

返された日付値または日時値を間隔の中間点(開始位置と終了位置の値の平均)に配置するように指定します。

別名 M

END

返された日付値または日時値を間隔の終了点に配置するように指定します。

別名 E

SAME

返された日付を入力日付と同じ場所に配置するように指定します。

別名 S
SAMEDAY
参照項目 詳細については、SAME配置を参照してください。
デフォルト BEGINNING
参照項目 SAS日付出力の間隔内の位置合わせ 詳細については、を参照してください。

custom-interval

定義する間隔を指定します。

詳細

基本

INTNX関数は、DAY、WEEK、QTR、MINUTEなどの間隔、または定義したカスタム間隔単位で日付、時間または日時の値を増分します。間隔は、開始日付、時間または日時の値、および指定した時間間隔に基づきます。
INTNX関数は、start–from引数で指定した間隔の開始日付、時間または日時の値に対するSAS日付値を返します。(SAS日付値をカレンダ日付に変換するには、DATE9形式などの有効なSAS日付形式を使用します)。2003年10月17日の週から6週間後の週の開始日を確認する方法の例を次に示します。
x=intnx('week', '17oct03'd, 6);
put x date9.;
INTNXは値23NOV2003を返します。
日付間隔と時間間隔の操作の詳細については、日付間隔と時間間隔 を参照してください。

日付間隔と日時間隔

SAS日時値で使用する必要のある間隔は、SAS日時間隔です。日時間隔を形成するには、日付間隔に接頭辞"DT"を付加します。たとえば、MONTHはSAS日付間隔で、DTMONTHはSAS日時間隔です。同様に、YEARはSAS日付間隔で、DTYEARはSAS日時間隔です。
間隔関数で確実に正しい結果を得るためには、日付値での日付間隔と日時値での日時間隔を使用します。日時間隔で日付値を使用する場合、SASはエラーメッセージを返しませんが、結果は正しくありません。
data _null_;
      /* The following statement creates expected results. */
   date1=intnx('dtday', '01aug11:00:10:48'dt, 1);
      /* The following two statements create unexpected results. */
   date2=intnx('dtday', '01aug11'd, 1);
   date3=intnx('dtday', '01aug11:00:10:48'd, 1);
   put 'Correct Datetime Value   ' date1= datetime19. /
       'Incorrect Datetime Value ' date2= datetime19. /
       'Incorrect Datetime Value ' date3= datetime19.;
run;
次の出力がログに書き込まれます。
Correct Datetime Value date1=02AUG2011:00:00:00 Incorrect Datetime Value date2=02JAN1960:00:00:00 Incorrect Datetime Value date3=02JAN1960:00:00:00

SAS日付出力の間隔内の位置合わせ

通常、SAS日付値はinterval引数で指定した時間間隔の開始点に配置されます。
任意のalignment引数を使用して、返された値の配置を指定できます。値BEGINNING、MIDDLEまたはENDは、それぞれ間隔の開始点、中間点または終了点に日付を配置します。

SAME配置

alignment引数のSAME値を使用した場合、INTNXは指定した間隔の増分を計算した後に同じカレンダ日付を返します。同じカレンダ日付は、間隔ではなく間隔のシフト期間に基づいて配置されます。有効なシフト期間については、Intervals Used with Date and Time Functions (SAS言語リファレンス: 解説編)を参照してください。
シフト期間のほとんどの値は、その対応する間隔と等しくなります。この例外は、間隔WEEK、WEEKDAY、QTR、SEMIYEAR、YEAR、およびこれらに対応するDTです。WEEKおよびWEEKDAY間隔にはDAYSのシフト期間が含まれ、QTR、SEMIYEARおよびYEAR間隔にはMONTHのシフト期間が含まれます。たとえば、YEARでSAME配置を使用した場合、この間隔のシフト期間であるMONTHに基づいて同日に配置されます。YEAR間隔の同日に配置されるわけではありません。倍数の間隔を指定した場合、デフォルトのシフト間隔は倍数の間隔ではなく元の間隔に基づきます。
QTR、SEMIYEARおよびYEAR間隔にSAME配置を使用する場合、計算結果日付は間隔の開始点(入力日付)からの月数と同じです。月の日は可能な限り同じ日に合わせられます。月によっては日数が異なるため、月の日を常に一致させることは不可能です。
シフト期間の詳細については、Intervals Used with Date and Time Functions (SAS言語リファレンス: 解説編)を参照してください。

配置の間隔

入力日付の配置に基づいて計算結果日付を配置するには、alignment引数にSAME値を使用します。
intnx('week', '15mar2000'd, 1, 'same');         returns 22MAR2000
intnx('dtweek','15mar2000:8:45'dt, 1, 'same'); returns 22MAR2000:08:45:00
intnx('year', '15mar2000'd, 5, 'same');        returns 15MAR2005

日付を調整する

増分された間隔の日付が存在しない場合、INTNX関数はその日付を自動的に調整します。次に例を示します。
intnx('month', '15mar2000'd, 5, 'same');  returns 15AUG2000
intnx('year', '29feb2000'd, 2, 'same');   returns 28FEB2002
intnx('month', '31aug2001'd, 1, 'same');  returns 30SEP2001
intnx('year', '01mar1999'd, 1, 'same');   returns 01MAR2000 (the first day of the
                                                            3rd month of the year)
intnx('year', '29feb2000'd, 2);では、INTNX関数は値01JAN2002を返します。この値は、開始日の年(2000)から2年後の最初の日付です。
intnx('year', '29feb2000'd, 2, 'same');では、INTNX関数は値28FEB2002を返します。この場合、開始日は2000年で、結果となる年は2年後(2002)、月は同月(2月)、日付は28日が2002年2月29日に最も近いため、これらの値になります。

カスタム間隔

カスタム間隔はSASデータセットで定義します。データセットにはbegin変数を含める必要があり、end変数とseason変数を含めることもできます。各オブザベーションは、間隔の開始点が含まれるbegin変数、および存在する場合は間隔の終了点を含むend変数で1つの間隔を表します。間隔は昇順で記述する必要があります。間隔間にギャップは存在できません。また、間隔は重複できません。
SASシステムオプションINTERVALDS=は、カスタム間隔を定義して間隔データセットを新しい間隔名に関連付けるために使用します。INTERVALDS=システムオプションを指定する方法の例を次に示します。
options intervalds=(interval=libref.dataset-name);
引数
interval
間隔名を指定します。intervalの値は、libref.dataset-nameで命名されたデータセットです。
libref.dataset-name
ユーザーが指定した祝日を含むファイルのライブラリ参照名とデータセット名を指定します。
詳細については、カスタム時間間隔を参照してください。

販売カレンダの間隔

小売業界では、1年のカレンダを13週間からなる4つの期間に分けてデータを計算することがよくあります。期間の形式は、4-4-5、4-5-4または5-4-4のいずれかに基づきます。1番目、2番目、3番目の数値には、それぞれ各期間の1か月目、2か月目、3か月目の週数を指定します。詳細については、Retail Calendar Intervals: ISO 8601 Compliant (SAS言語リファレンス: 解説編)を参照してください。

例1

SASステートメントとその結果を次に示します。
SASステートメント
結果
yr=intnx('year', '05feb94'd, 3);
put yr / yr date7.;
13515 
01JAN97
x=intnx('month', '05jan95'd, 0);
put x / x date7.;
12784
01JAN95
next=intnx('semiyear', '01jan97'd, 1);
put next / next date7.;
13696
01JUL97
past=intnx('month2', '01aug96'd, -1);
put past / past date7.;
13270
01MAY96
sm=intnx('semimonth2.2', '01apr97'd, 4);
put sm / sm date7.;
13711 
16JUL97
x='month';
date='1jun1990'd;
nextmon=intnx(x, date, 1);
put nextmon / nextmon date7.;
11139
01JUL90
x1='month     ';
x2=trim(x1);
date='1jun1990'd - 100;
nextmonth=intnx(x2, date, 1);
put nextmonth / nextmonth date7.;
11017
01MAR90
任意のalignment引数を使用して日付を進める例を次に示します。
SASステートメント
結果
date1=intnx('month', '01jan95'd, 5, 'beginning');
put date1 / date1 date7.;
 
12935 
01JUN95
date2=intnx('month', '01jan95'd, 5, 'middle');
put date2 / date2 date7.;
 
12949
15JUN95
date3=intnx('month', '01jan95'd, 5, 'end');
put date3 / date3 date7.;
 
12964
30JUN95
date4=intnx('month', '01jan95'd, 5, 'sameday');
put date4 / date4 date7.;
 
12935
01JUN95
date5=intnx('month', '15mar2000'd, 5, 'same');
put date5 / date5 date9.;
 
14837
15AUG2000
interval='month';
date='1sep2001'd;
align='m';
date4=intnx(interval, date, 2, align);
put date4 / date4 date7.;
15294
15NOV01
x1='month     ';
x2=trim(x1);
date='1sep2001'd + 90;
date5=intnx(x2, date, 2, 'm');
put date5 / date5 date7.;
15356
16JAN02

例2: カスタム間隔の使用例

次の例では、INTNX関数のcustom-interval形式を使用して、指定した時間間隔で日付、時間または日時の値を増分します。
options intervalds=(weekdaycust=dstest);
data dstest;
   format begin end date9.;
   begin='01jan2008'd; end='01jan2008'd; output;
   begin='02jan2008'd; end='02jan2008'd; output;
   begin='03jan2008'd; end='03jan2008'd; output;
   begin='04jan2008'd; end='06jan2008'd; output;
   begin='07jan2008'd; end='07jan2008'd; output;
   begin='08jan2008'd; end='08jan2008'd; output;
   begin='09jan2008'd; end='09jan2008'd; output;
   begin='10jan2008'd; end='10jan2008'd; output;
   begin='11jan2008'd; end='13jan2008'd; output;
   begin='14jan2008'd; end='14jan2008'd; output;
   begin='15jan2008'd; end='15jan2008'd; output;
run;
 
data _null_;
   format start date9. endcustom date9.;
   start='01jan2008'd;
   do i=0 to 9;
      endcustom=intnx('weekdaycust', start, i);
      put endcustom;
   end;
run;
次の出力がログに書き込まれます。
01JAN2008 02JAN2008 03JAN2008 04JAN2008 07JAN2008 08JAN2008 09JAN2008 10JAN2008 11JAN2008 14JAN2008

関連項目:

システムオプション:
INTERVALDS= System Option (SASシステムオプション: リファレンス)
前のページ|次のページ|ページの先頭へ