前のページ|次のページ

CALL IS8601_CONVERTルーチン

ISO 8601規格の間隔を日時値とデュレーション値に変換します。または、日時値とデュレーション値をISO 8601規格の間隔に変換します。

カテゴリ: 日付と時間

構文

必須引数

convert-from

日付、日時とデュレーション、デュレーション、間隔値など、変換元を示すキーワードを一重引用符で囲んで指定します。convert-fromは次のいずれかの値を取ることができます。

'dn'

日付値を指定します。このとき、nは1から6までの値です。デフォルト値は、1です。nfrom-variables引数またはto-variables引数のコンポーネント数です。有効なコンポーネントは次のとおりです。

'dtn'

日時値を指定します。このとき、nは1から6までの値です。デフォルト値は、1です。nfrom-variables引数またはto-variables引数のコンポーネント数です。有効なコンポーネントは次のとおりです。

'dt/dt'

変換元の値が日時/日時値であることを指定します。

'dt/du'

変換元の値が日時/デュレーション値であることを指定します。

'dun'

変換元の値がデュレーション値であることを指定します。このとき、nは1から6までの値です。デフォルト値は、1です。nfrom-variables引数またはto-variables引数のコンポーネント数です。有効なコンポーネントは次のとおりです。

'du/dt'

変換元の値がデュレーション/日時値であることを指定します。

'intvl'

変換元の値が間隔値であることを指定します。

convert-to

変換の結果を示すキーワードを一重引用符で囲んで指定します。convert-toは次のいずれかの値を取ることができます。

'dn'

日付値を指定します。このとき、nは1から6までの値です。デフォルト値は、1です。nfrom-variables引数またはto-variables引数のコンポーネント数です。有効なコンポーネントは次のとおりです。

'dtn'

日時値を指定します。このとき、nは1から6までの値です。デフォルト値は、1です。nfrom-variables引数またはto-variables引数のコンポーネント数です。有効なコンポーネントは次のとおりです。

'dt/dt'

日時/日時間隔の作成を指定します。

'dt/du'

日時/デュレーションの間隔の作成を指定します。

'dun'

デュレーションの作成を指定します。このとき、nは1から6までの値です。デフォルト値は、1です。nfrom-variables引数またはto-variables引数のコンポーネント数です。有効なコンポーネントは次のとおりです。

'du/dt'

デュレーション/日時間隔の作成を指定します。

'end'

間隔値の終了日時またはデュレーションの終了の作成を指定します。

'intvl'

間隔値の作成を指定します。

'start'

間隔値の開始日時またはデュレーションの開始の作成を指定します。

オプション引数

from-variable

変換元の値を含む1つまたは2つの変数を指定します。間隔値の変数を1つ指定し、日時値およびデュレーション値に1つずつ(計2つ)の変数を指定します。日時値とデュレーション値は間隔のコンポーネントで、1番目の値は間隔の開始値を示し、2番目の値は間隔の終了値を示します。

要件 整数変数は、少なくとも16バイトの文字変数である必要があります。この変数の値は$N8601Bw.d入力形式または$N8601Ew.d入力形式で読み込まれます。整数変数は、CALL IS8601_CONVERTルーチンを呼び出して返される整数値の場合もあります。
日時値は、SAS日時値であるか、あるいは$N8601Bw.d入力形式または$N8601Ew.d入力形式、もしくはCALL IS8601_CONVERTルーチンの呼び出しによって値が読み込まれる8バイトの文字値である必要があります。
デュレーション値は、デュレーションを秒数で表す数値であるか、あるいは$N8601Bw.d入力形式または$N8601Ew.d入力形式、もしくはCALL IS8601_CONVERTルーチンの呼び出しによって値が読み込まれる8バイトの文字値である必要があります。

to-variable

変換値を含む1つまたは2つの変数を指定します。間隔値の変数を1つ指定し、日時値およびデュレーション値に1つずつ(計2つ)の変数を指定します。

要件 整数変数は、少なくとも16バイトの文字変数である必要があります。
ヒント 日時変数およびデュレーション変数は数値または文字になります。数値の精度を維持するには、数値変数の長さは少なくとも8文字である必要があります。日時およびデュレーションの文字変数は、少なくとも16バイトである必要があります。変数長よりも短い値には空白文字が埋め込まれます。

date-time-replacements

月、日または時間のコンポーネントが間隔値、日時値またはデュレーション値で省略されているときに使用する日付または時間のコンポーネント値を指定します。date-time-replacements引数にはカンマで区切られた一連の数字を指定し、その数字が年、月、日、時、分、秒の順でコンポーネントを表します。date-time-replacementsのコンポーネントは、後方から、秒、分、時、日、月、年の順で省略できます。代入値が指定されていない場合は、デフォルト値を使用して変換が実行されます。

デフォルト 日付コンポーネントおよび時間コンポーネントが省略された場合のデフォルト値は次のとおりです。
1
1
0
0
0
要件 年コンポーネントは日時値またはデュレーション値の一部である必要があります。したがって、date-time-replacementsには使用できません。date-time-replacementsでは、年のプレースホルダとしてカンマを使用する必要があります。たとえば、置換値文字列 ,9,4,,2,'で1番目のカンマは年の値のプレースホルダです。

詳細

基本

ISO8601規格内の日付値、時間値および日時値のISO 8601表現は、基本表記と拡張表記から成ります。値内の各種コンポーネントの区切り文字が省略されている場合は、基本の値です。区切り文字によってコンポーネントが区切られている場合は、拡張された値です。出力形式と入力形式のセットがISO 8601規格の日付値、時間値および日時値に使用されます。詳細については、Working with Dates and Times By Using the ISO 8601 Basic and Extended Notations (SAS出力形式と入力形式: リファレンス)およびReading Dates and Times By Using the ISO 860 Basic and Extended Notations (SAS出力形式と入力形式: リファレンス)を参照してください。
値をSAS変数として保存した後、CALL IS8601_CONVERTルーチンで間隔値、デュレーション値および日時値を計算できます。このルーチンでは、ISO 8601規格の間隔を日時値とデュレーション値に変換できます。または、日時値とデュレーション値をISO 8601規格の間隔に変換できます。CALL IS8601_CONVERTルーチンは、dn引数、dtn引数およびdun引数で欠損値を受け入れます。また、CALL IS8601_CONVERTルーチンを使用して、日付と時間で計算を実行することもできます。
年、月、日、時、分、秒コンポーネントを任意の順序で使用できます。

CALL IS8601_CONVERTルーチンの引数の使用方法

CALL IS8601_CONVERTルーチンの第1引数convert-fromには、1つまたは2つの値を指定できます。値の数は、期待される結果に対してルーチンに提供する変数の数に基づきます。たとえば、日時値とデュレーション値を、期待される間隔出力と一緒に指定できます。この例では、第1引数は'dt/du'で提供されます。2つの日付値が、出力として期待されるデュレーションに提供される場合、第1引数は'dt/dt'になります。
CALL IS8601_CONVERTルーチンの第2引数convert-toにも、1つまたは2つの値を指定できます。この値は、第1引数で提供した入力を使用した計算で期待される結果の種類によって異なります。
注: デュレーションの最小長は16で、間隔の最小長は32です。

例1: CALL IS8601_CONVERTルーチンの使用

このDATAステップでは、CALL IS8601_CONVERTルーチンを使用して次のタスクを実行します。
  • 日時値およびデュレーション値を使った間隔の作成
  • CALL ISO8601_CONVERTルーチンを使って作成した間隔からの日時値およびデュレーション値の作成
  • 日時値で省略された日付コンポーネントおよび時間コンポーネントに置換値を使用した、日時値およびデュレーション値からの間隔の作成
読みやすいように、数値変数の末尾はN、文字列変数の末尾はCとなっています。
data _null_;
      /* Declare variable length and type. Character datetime and duration   */
      /* values must be at least 16 characters. To avoid losing precision,   */
      /* the numeric datetime value has a length of 8.                       */
   length dtN duN 8 dtC duC $16 intervalC $32;
      /* Assign a numeric datetime value and a character duration value.     */
   dtN='15Sep2011:09:00:00'dt;
   duC=input('P2y3m4dT5h6m7s', $n8601b.);
   put dtN=;
   put duC=;
      /* Create an interval from a datetime and duration value and format the */
      /* interval using the ISO 8601 extended notation for character values.  */
   call is8601_convert('dt/du', 'intvl', dtN, duC, intervalC);
   put '**  Character interval created from datetime and duration values **/';
   put intervalC $n8601e.;
   put ' ';
      /* Create numeric datetime and duration values from an interval and     */
      /* format the values using the ISO 8601 extended notation for numeric   */
      /* values.                                                              */
   call is8601_convert('intvl', 'dt/du', intervalC, dtN, duN);
   put '**  Character datetime and duration created from an interval  **/';
   put dtN=;
   put duN=;
   put ' ';
      /* Assign a new datetime value with omitted components.                  */
   dtC=input('2012---15T10:-:-', $n8601b.);
   put '** This datetime is a character value. **';
   put dtC $n8601h.;
   put ' ';
      /* Create an interval by reading a datetime value that has omitted date  */
      /* and time components.  Use replacement values for the month, minutes,  */
      /* and seconds.                                                          */
   call is8601_convert('du/dt', 'intvl', duC, dtC, intervalC, , 7, , , 35, 45);
   put '**  Interval created using a datetime with omitted values,      **';
   put '**  inserting replacement values for month (7), minute (35)     **';
   put '**  seconds (45).                                               **';
   put intervalC $n8601e.;
   put ' ';
run;
SASは次の結果をログに書き込みます。
dtN=1631696400 duC=0002304050607FFC **  Character interval created from datetime and duration values **/ 2011-09-15T09:00:00.000/P2Y3M4DT5H6M7S **  Character datetime and duration created from an interval  **/ dtN=1631696400 duN=71211967 ** This datetime is a character value.** 2012---15T10:-:- **  Interval created using a datetime with omitted values,      ** **  inserting replacement values for month (7), minute (35)     ** **  seconds (45).                                               ** P2Y3M4DT5H6M7S/2012-07-15T10:35:45

例2: 間隔値の確認

この例では、デュレーション値と日時値がログに書き込まれます。
data _null_;
   length mynew $32;
   x='P8w';
   y='11feb2012:12:35:22'dt;
   call is8601_convert('du/dt', 'intvl', x, y, mynew);
   put mynew=$n8601e.;
run;
SASは次の結果をログに書き込みます。
mynew=P8W/2012-02-11T12:35:22.000

例3: 間隔の開始日を確認

この例では、間隔開始日が返されます。
data temp;
   length dt $32;
   x='P6w';
   y='11feb2012:11:13:22'dt;
   call is8601_convert('du/dt', 'start', x, y, dt);
   put dt=$n8601e.;
run;
SASは次の結果をログに書き込みます。
dt=2011-12-31T00:00:00.000
この例では、P6wで6週間のデュレーションが指定され、ystartの計算元の日付となります。startは間隔の開始デュレーションです。この日時値はyの6週間前です。

例4: デュレーション値および日時値を使用した間隔の確認

この例では、デュレーション値と日時値を使用して間隔を確認します。
data _null_;
   infile datalines;
   input mo d yr hour min sec; 
   length mynew $32;
   x='P8w';
   call is8601_convert('du/dt6', 'intvl', x, mo, d, yr, hour, min, sec, mynew);
   put mynew=$n8601e.;
   datalines;
02 22 2011 10 30 45
12 13 2010 12 35 25
03 26 2010 10 10 10
;
run;
SASは次の結果をログに書き込みます。
mynew=P8W/0002-14-91T10:30:45.000 mynew=P8W/0012-13-90T12:35:25.000 mynew=P8W/0003-14-90T10:10:10.000

例5: 複数の間隔の開始日を確認

この例では、データ行を入力として使用し、間隔の開始日を確認します。
data temp;
   input y mo d h min s;
   length mynew $16;
      /* This value is the duration. */
   x='P2w';
      /* This CALL routine uses the date and time values that are */
      /* listed in the data lines to create a DATETIME value.     */
   call is8601_convert('dt6', 'dt', y, mo, d, h, min, s, dt);
   put dt=datetime.;
      /* This CALL routine uses the DATETIME value that was previously */
      /* created.                                                      */
   call is8601_convert('du/dt', 'start', x, dt, mynew);
   put mynew=$n8601e.;
datalines;
2011 6 7 10 15 20
2011 12 5 10 25 45
2011 6 30 10 32 20
;
SASは次の結果をログに書き込みます。
dt=07JUN11:10:15:20 mynew=2011-05-24T00:00:00.000 dt=05DEC11:10:25:45 mynew=2011-11-21T00:00:00.000 dt=30JUN11:10:32:20 mynew=2011-06-16T00:00:00.000

例6: デュレーションをSAS時間に変換

この例では、デュレーション値p8wを指定します。これは8週間を示します。この種類の値は日時値と組み合わせてデュレーションを示すことが多いのですが、値を単独で使用してSAS時間値に変換することもできます。P8w値をSAS時間値に変換するSAS入力形式はありませんが、CALL IS8601_CONVERTルーチンを使用して値を変換することができます。
data a;
   x='P8w';
   call is8601_convert('du', 'du', x, mynew);
   put mynew=time8.;
run;
Mynewの値は1344:00です。これは1344時間を示します。
この例についての説明は次のとおりです。
  • X変数はデュレーションです。したがって、'du'が第1引数です。
  • 出力としては時間値が期待されますが、時間に対するconvert-to値がありません。その結果、'du'の値がデュレーションに使用されます。どちらの引数にも一重引用符が必要です。
  • Xは提供される変数名で、Mynewは作成される変数です。
  • 結果がSAS時間値なので、SAS時間出力形式(TIME8.)を使用できます。

例7: デュレーションおよび日時値を間隔に変換

この例では、1ステップ前の例にのっとり、同じデュレーション値を日付値と一緒に利用して、間隔を出力として作成します。次のDATAステップは、8週間続いて2012年2月11日の午後12時22分に終了するイベントに基づいています。
data a;
   length mynew $32;
   x='P8w';
   y='11feb2012:12:22'dt;
   call is8601_convert('du/dt', 'intvl', x, y, mynew);
   put mynew=$n8601e.;
run;
Mynewの値はP8W/2012-02-11T12:22:00.000です。
この例についての説明は次のとおりです。
  • CALL IS8601_CONVERTルーチンの第1引数'du/dt'は、変換のために渡される変数の種類を示します。値'du/dt' で、2つの変数が渡されることが指定されます。1つはデュレーション値のX、もう1つは日時値のYです。デュレーション値が日時より前に位置するので、日時値が間隔の終了を示すとみなされます。
  • このDATAステップから期待される結果は間隔です。したがって、第2引数は'intvl'です。
  • 残りの引数では、入力変数XおよびY、ならびに作成される新しい変数Mynewが指定されます。これらの変数の順序は、第1引数で指定された変数の種類と一致させる必要があります。たとえば、XYが逆順の場合は、ログに次のNOTEが表示されます。
    NOTE: Invalid argument to function IS8601_CONVERT('du/dt','intvl',1644582120, 'P8w',''[12 of 32 characters shown]) at line 770 column 9. mynew=************************************************** mynew= x=P8w y=1644582120 _ERROR_=1 _N_=1

例8: デュレーションと日時がある場合の間隔開始日時の計算

デュレーションおよび日時値を間隔に変換 では、日時値とデュレーション値が指定された場合に間隔を計算します。この例では、デュレーション値と日時値が指定された場合に間隔の開始日時を計算します。
data a;
   length mynew $16;
      /* If you omit the LENGTH statement, replace the PUT statement */
      /* with 'put mynew datetime22.;'.                              */
   x='P8w';
   y='11feb2012:12:22'dt;
   call is8601_convert('du/dt', 'start', x, y, mynew);
   put mynew=$n8601e.;
run;
Mynewの値は2011-12-17T00:00:00.000です。
この例についての説明は次のとおりです。
  • CALL IS8601_CONVERTルーチンは、間隔の開始日時値を計算するために、第2引数として引数startを使用します。
  • SAS日時値が計算されることから、LENGTHステートメントを削除して、Mynewが数値変数として作成されるようにできます。LENGTHステートメントを削除する場合は、DATETIME22.出力形式を指定するPUTステートメントを追加します。LENGTHステートメントは削除せず、2番目のPUTステートメントに示したように、$N8601Ew.出力形式を使用して変数出力を作成することも有効です。

例9: ある種類のデュレーションを異なる種類のデュレーションに変換

時間で表されたデータを受け取った場合、前述の例に似た変換を実行し、出力をデュレーションとして取得できます。
data _null_;
   x='1271:59:00';
   time=input(x, time10.);
   length dur $16;
   call is8601_convert('du', 'du', time, dur);
   put dur=$n8601e.;
run;
durの値はP0Y1M22DT23H59M0.0Sです。
この例についての説明は次のとおりです。
  • TIMEw.d出力形式では、時間値がSASに読み込まれます。
  • CALL IS8601_CONVERTルーチンは、時間値をデュレーション値に変換します。

例10: 2つの日時値をデュレーションに変換

この例では、2つの日時値間の時間を決定し、デュレーションを出力として作成します。
data a;
   length dur $16;
   start='02apr2012:12:30:22'dt;
   end='08apr2012:14:32:22'dt;
   call is8601_convert('dt/dt', 'du', start, end, dur);
   put dur=$n8601e.;
run;
durの値はP6DT2H2Mです。
この例についての説明は次のとおりです。
  • CALL IS8601_CONVERTルーチンでは、次の引数が使用されます。
    • 'dt/dt'は、2つの日時値が関数に渡されることを示します。
    • 'du'は、デュレーション値が予期される結果であることを示します。
    • 'start'は、最初の日時変数の名前です。
    • 'end'は、2番目の日時変数の名前です。
    • 'dur'は、目的の出力変数の名前です。
  • Durが長さが16の文字変数であることを指定するためには、LENGTHステートメントが必要です。間隔を作成する場合は、32の長さが必要です。
  • このルーチンは、解読不能な16進値を作成します。したがって、$N8601出力形式のいずれかで値をフォーマットする必要があります。この場合は、$N8601Ew.dです。

例11: 間隔を日時値およびデュレーションに変換

間隔値は、フォワードスラッシュ(/)で区切られた2つの日時値で指定できます。この例に示すように、イベントの開始値と終了値をスラッシュで区切ります。
data _null_;
   length Final2 $16;
   int=input('2012-03-15T14:32:00/2012-03-29T09:45:00', $n8601e40.);
   call is8601_convert('intvl', 'dt/du', int, Final1, Final2);
   put Final1= / Final2=$n8601e.;
run;
Final1とFinal2の結果値を次に示します。
  • Final1=1647441120
  • Final2=P13DT19H13M
この例についての説明は次のとおりです。
  • 日時値が一重引用符内に指定されているので、INPUT関数および$N8601Ew. 入力形式で、値を変数Intの間隔値に変換できます。
  • CALL IS8601_CONVERTルーチンは、その間隔値を2つの変数に変換します。Final1が日時変数、Final2がデュレーション変数です。
  • SAS日時変数(Final1)は8バイトに保存可能な数値変数であるため、この変数に関して長さの値をLENGTHステートメントに指定する必要はありません。ただし、デュレーションは16の長さが必要であるため、Final2に対する長さをLENGTHステートメントで指定します。
  • Final2はデュレーションなので、$N8601Ew. 出力形式を使用して値がログに書き込まれるため、その出力は理解可能になります。
例にある最初の日時に月値が欠損していた場合(2012- - -15T14:32:00)、次に示すように、CALLルーチンの最後の引数で値を指定することにより、その値を提供できます。
call is8601_convert('intvl', 'dt/du', int, Final1, Final2, , 2);
このCALLルーチンでは、月が2として指定され、その値の前にある連続する2つのコンマで、年値は提供されないことを示しています。したがって、日時とデュレーションは、日付2012–02–15T14:32:00と、コードに指定されたもう一方の日付に基づいて計算されます。この場合、各変数のPUTステートメントからの出力は次のとおりです。
  • Final1=1644935520
  • Final2=P1M13DT19H13M
前のページ|次のページ|ページの先頭へ