日付情報の処理

このドキュメントでは、Natural アプリケーションでの日付情報の処理について、さまざまな面から説明します。

以下のトピックについて説明します。


日付フィールドの編集マスクおよび日付システム変数

日付フィールドの値を特定の表現で出力する場合は、通常、フィールドに編集マスクを指定します。編集マスクを使用して、1 文字ずつどのように出力するかを指定します。

現在の日付を特定の表現で使用する場合、日付フィールドを定義して編集マスクを指定する必要はありません。代わりに、日付システム変数を使用します。Natural には、さまざまな日付システム変数が用意されています。その中には、表現の異なる現在日付も含まれています。これらの表現には 2 桁の年を含むものもあれば、4 桁の年を含むものもあります。

すべての日付システム変数のリストと詳細については、『システム変数』ドキュメントを参照してください。

デフォルトの日付編集マスク - DTFORM パラメータ

DTFORM プロファイルパラメータによって、Natural レポートのデフォルトタイトルの日付部分、日付定数、および日付入力に使用されるデフォルトのフォーマットが決まります。

この日付フォーマットを使用して、日付の年、月、日の各コンポーネントの順序、およびこれらのコンポーネント間で使用するデリミタ文字を指定します。

有効な DTFORM の設定は、以下のとおりです。

設定 日付フォーマット1 2
DTFORM=I yyyy-mm-dd 2014-01-31
DTFORM=G dd.mm.yyyy 31.01.2014
DTFORM=E dd/mm/yyyy 31/01/2014
DTFORM=U mm/dd/yyyy 01/31/2014

1 dd = 日、mm = 月、yyyy = 年
2 は、DF または DFTITLE の設定が L であることを前提とします

DTFORM パラメータは、Natural パラメータモジュール/ファイル内で設定できます。また、Natural を起動するときにダイナミックに設定することもできます。デフォルトでは、DTFORM=I が適用されます。

英数字表現の日付フォーマット - DF パラメータ

編集マスクが指定されている場合、フィールド値の表現は編集マスクによって決まります。編集マスクが指定されていない場合、フィールド値の表現は、セッションパラメータ DF とプロファイルパラメータ DTFORM の組み合わせによって決まります。

DF パラメータでは、以下の日付表現の 1 つを選択できます。

DF=S 2 桁の年とデリミタを使用する 8 バイトの表記です。例:yy-mm-dd
DF=I 4 桁の年を使用しデリミタを使用しない 8 バイトの表記です。例:yyyymmdd
DF=L 4 桁の年とデリミタを使用する 10 バイトの表記です。例:yyyy-mm-dd

各表現に対する、年、月、日の各コンポーネントの順序、および使用するデリミタ文字は、DTFORM パラメータによって決まります。

デフォルトでは、DF=S が適用されます(INPUT ステートメントを除く。下記参照)。

セッションパラメータ DF は、コンパイル時に評価されます。

このパラメータは、以下のステートメントで指定できます。

上記のステートメントのいずれかで指定すると、DF パラメータは以下のように適用されます。

ステートメント DF パラメータの効果
DISPLAYWRITEPRINT これらのステートメントの 1 つを使用して日付変数の値を出力すると、出力する前に値が英数字表現に変換されます。DF パラメータにより、使用される表現が決まります。
MOVE, COMPRESS MOVE または COMPRESS の各ステートメントを使用して日付変数の値を英数字フィールドに転送すると、転送する前に値が英数字表現に変換されます。DF パラメータにより、使用される表現が決まります。
STACKRUNFETCH 日付変数の値をスタックに格納すると、スタックに格納する前に値が英数字表現に変換されます。DF パラメータにより、使用される表現が決まります。

FETCH ステートメントまたは RUN ステートメントのパラメータとして日付変数を指定する場合も同様です(これらのパラメータもスタック経由で渡されるため)。

INPUT INPUT ステートメントでデータ変数を使用する場合、DF パラメータによって、値をどのようにフィールドに入力する必要があるかが決まります。

ただし、DF パラメータを指定せずに日付変数を INPUT ステートメントで使用すると、デリミタ付きの 2 桁の年、またはデリミタなしの 4 桁の年のいずれかで日付を入力できます。この場合も、年、月、日の順序、および使用するデリミタ文字は、DTFORM パラメータによって決まります。

注意:
DF=S で提供される年情報は 2 桁のみです。これは、日付の値に世紀が含まれていると、変換時にこの情報が失われることを意味します。世紀の情報を保持するには、DF=I または DF=L を設定します。

WRITE ステートメントでの DF パラメータの例

これらの例では、DTFORM=G が適用されると仮定します。

/* DF=S (default) 
WRITE *DATX   /* Output has this format: dd.mm.yy 
END
FORMAT DF=I  
WRITE *DATX   /* Output has this format: ddmmyyyy 
END
FORMAT DF=L 
WRITE *DATX   /* Output has this format: dd.mm.yyyy 
END

MOVE ステートメントでの DF パラメータの例

この例では、DTFORM=E が適用されると仮定します。

DEFINE DATA LOCAL 
  1 #DATE  (D) INIT <D'31/01/2014'> 
  1 #ALPHA (A10) 
END-DEFINE 
... 
MOVE #DATE        TO #ALPHA /* Result: #ALPHA contains 31/01/14   
MOVE #DATE (DF=I) TO #ALPHA /* Result: #ALPHA contains 31012014   
MOVE #DATE (DF=L) TO #ALPHA /* Result: #ALPHA contains 31/01/2014 
...

STACK ステートメントでの DF パラメータの例

この例では、DTFORM=I が適用されると仮定します。

DEFINE DATA LOCAL 
  1 #DATE  (D) INIT <D'2014-01-31'>
  1 #ALPHA1(A10) 
  1 #ALPHA2(A10) 
  1 #ALPHA3(A10) 
END-DEFINE 
... 
STACK TOP DATA #DATE (DF=S) #DATE (DF=I) #DATE (DF=L) 
... 
INPUT #ALPHA1 #ALPHA2 #ALPHA3 
... 
/* Result: #ALPHA1 contains 14-01-31   
/*         #ALPHA2 contains 20140131   
/*         #ALPHA3 contains 2014-01-31 
...

INPUT ステートメントでの DF パラメータの例

この例では、DTFORM=I が適用されると仮定します。

DEFINE DATA LOCAL 
  1 #DATE1 (D) 
  1 #DATE2 (D) 
  1 #DATE3 (D) 
  1 #DATE4 (D) 
END-DEFINE 
... 
INPUT #DATE1 (DF=S) /* Input must have this format: yy-mm-dd 
      #DATE2 (DF=I) /* Input must have this format: yyyymmdd 
      #DATE3 (DF=L) /* Input must have this format: yyyy-mm-dd 
      #DATE4        /* Input must have this format: yy-mm-dd or yyyymmdd 
...

出力用の日付フォーマット - DFOUT パラメータ

セッション/プロファイルパラメータ DFOUT は、編集マスクが指定されておらず、DF パラメータも適用されていない、INPUTDISPLAYWRITE、および PRINT の各ステートメントの日付フィールドにのみ適用されます。

INPUTDISPLAYPRINT、および WRITE の各ステートメントによって表示され、編集マスクが指定されておらず、DF パラメータも適用されてない日付フィールドの場合は、プロファイル/セッションパラメータ DFOUT によって、表示するフィールド値のフォーマットが決まります。

DFOUT パラメータでは、以下の日付表現の 1 つを選択できます。

DFOUT=S 2 桁の年とデリミタを使用する 8 バイトの表記です。例:yy-mm-dd
DFOUT=I 4 桁の年(デリミタなし)を使用する 8 バイトの表記です。例:yyyymmdd

デフォルトでは、DFOUT=S が適用されます。

各表現に対する、年、月、日の各コンポーネントの順序、および使用するデリミタ文字(該当する場合)は、DTFORM パラメータによって決まります。

どちらの日付値表現でも 8 バイトのフィールドに収まるため、日付フィールドの長さは DFOUT 設定の影響を受けません。

DFOUT パラメータは、Natural パラメータモジュール/ファイル内で、または Natural を起動するときにダイナミックに、あるいはシステムコマンド GLOBALS を使用してセッションレベルで設定できます。これは、ランタイム時に評価されます。

例:

この例では、DTFORM=I が適用されると仮定します。

DEFINE DATA LOCAL 
1 #DATE  (D) INIT <D'2014-01-31'> 
END-DEFINE 
... 
WRITE #DATE        /* Output if DFOUT=S is set ...: 14-01-31 
                   /* Output if DFOUT=I is set ...: 20140131 
WRITE #DATE (DF=L) /* Output (regardless of DFOUT): 2014-01-31 
...

スタック用の日付フォーマット - DFSTACK パラメータ

セッション/プロファイルパラメータ DFSTACK は、DF パラメータが指定されていない、STACKFETCH、および RUN の各ステートメントで使用されている日付フィールドにのみ適用されます。

DFSTACK パラメータによって、STACKRUNFETCH の各ステートメント経由でスタックに格納される日付変数の値のフォーマットが決まります。

DFSTACK パラメータは、Natural パラメータモジュール/ファイル内で、または Natural を起動するときにダイナミックに、あるいはシステムコマンド GLOBALS を使用してセッションレベルで設定できます。これは、ランタイム時に評価されます。

有効な DFSTACK の設定は、以下のとおりです。

DFSTACK=S 8 バイト日付変数は、デリミタ付きの 2 桁の年でスタックに格納されます。例:yy-mm-dd

DFSTACK=S は、(失われた)世紀の情報を含まない日付をスタックに格納します。その後、値をスタックから読み込んで別の日付変数に格納すると、世紀情報は現在のものであるとみなされるか、または YSLW パラメータ(年スライティングウィンドウも参照)の設定によって決まります。この操作によって、元の日付値と異なる世紀が設定される可能性があります。ただし、この場合、Natural はエラーを発行しません。

DFSTACK=C DFSTACK=S も同様です。ただし、

YSLW パラメータにより、あるいは元の世紀が現在の世紀と同じではないために、Natural は、日付値をスタックしたことで元の値と 1 世紀異なる結果になった場合にランタイムエラーを発行します。

DFSTACK=I 8 バイト日付変数は、デリミタなしの 4 桁の年でスタックに格納されます。例:yyyymmdd

デフォルトでは、DFSTACK=S が適用されます。

各データ表現に対する、年、月、日の各コンポーネントの順序、および使用するデリミタ文字は、DTFORM パラメータによって決まります。

例:

この例では、DTFORM=I および YSLW=0 が適用されているものとします。

DEFINE DATA LOCAL 
  1 #DATE  (D) INIT <D'2014-01-31'> 
  1 #ALPHA1(A8) 
  1 #ALPHA2(A10) 
END-DEFINE 
... 
STACK TOP DATA #DATE #DATE (DF=L) 
... 
INPUT #ALPHA1 #ALPHA2 
... 
/* Result if DFSTACK=S or =C is set: #ALPHA1 contains 14-01-31   
/* Result if DFSTACK=I is set .....: #ALPHA1 contains 20140131   
/* Result (regardless of DFSTACK) .: #ALPHA2 contains 2014-01-31 
...

年スライディングウィンドウ - YSLW パラメータ

プロファイルパラメータ YSLW を使用すると、2 桁の年の値に対する世紀を指定できます。

YSLW パラメータは、Natural パラメータモジュール/ファイル内で設定できます。また、Natural を起動するときにダイナミックに設定することもできます。2 桁の年を持つ英数字の日付値を日付変数に移すと、このパラメータはランタイム時に評価されます。これは、以下のデータ値に適用されます。

  • 算術関数 VAL(field) で使用するデータ値

  • 論理条件の IS(D) オプションで使用するデータ値

  • 入力データとしてスタックから読み込まれたデータ値

  • 入力データとして入力フィールドに入力されたデータ値

YSLW パラメータによって、"年スライディングウィンドウ" でカバーする年の範囲を特定します。スラインディングウィンドウのメカニズムは、2 桁の年の日付が 100 年の "ウィンドウ" 内にあるものと仮定します。この 100 年の範囲で、すべての 2 桁の年の値を特定の世紀に一意に関連付けることができます。

YSLW パラメータを使用して、100 年の範囲を何年前から開始するかを指定します。YSLW 値は、ウィンドウ範囲の最初の年を決定するために現在の年から減算されます。

YSLW パラメータの有効な値は、0~99 です。デフォルト値は YSLW=0 です。これは、スライディングウィンドウメカニズムを使用しないことを意味します。つまり、2 桁の年を持つ日付は、現在の世紀にあるとみなされます。

例 1

現在の年が 2014 年の場合に YSLW=40 を指定すると、スラインディングウィンドウは 1974~2073 年をカバーします。74~99 の 2 桁の年の値 nn は、19nn と解釈されます。一方、00~73 の 2 桁の年の値 nn は、20nn と解釈されます。

例 2:

現在の年が 2014 年の場合に YSLW=20 を指定すると、スラインディングウィンドウは 1994~2093 年をカバーします。94~99 の 2 桁の年の値 nn は、19nn と解釈されます。一方、00~93 の 2 桁の年の値 nn は、20nn と解釈されます。

DFSTACK と YSLW の組み合わせ

以下の例で、パラメータ DFSTACKYSLW をさまざまに組み合わせて使用することによる効果を説明します。

注意:
これらのすべての例において、DTFORM=I が適用されているものとします。

例 1

以下の例では、現在の年は 2014 年で、パラメータの設定には DFSTACK=S(デフォルト値)および YSLW=20 が適用されているものとします。

DEFINE DATA LOCAL 
  1 #DATE1 (D) INIT <D'1956-12-31'> 
  1 #DATE2 (D) 
END-DEFINE 
... 
STACK TOP DATA #DATE1 /* century information is lost (year 56 is stacked) 
... 
INPUT #DATE2          /* year sliding window determines 56 to be 2056 
... 
/* Result: #DATE2 contains 2056-12-31

この場合、年スライディングウィンドウは適切に設定されないため、世紀の情報は(意図しない値に)変更されます。

例 2:

以下の例では、現在の年は 2014 年で、パラメータの設定には DFSTACK=S(デフォルト値)および YSLW=60 が適用されているものとします。

DEFINE DATA LOCAL 
  1 #DATE1 (D) INIT <D'1956-12-31'> 
  1 #DATE2 (D) 
END-DEFINE 
... 
STACK TOP DATA #DATE1 /* century information is lost (year 56 is stacked) 
... 
INPUT #DATE2          /* year sliding window determines 56 to be 1956 
... 
/* Result: #DATE2 contains 1956-12-31

この場合、年スライディングウィンドウは適切に設定されるため、世紀の情報は正しく復元されます。

例 3:

以下の例では、現在の年は 2014 年で、パラメータの設定には DFSTACK=C および YSLW=0(デフォルト値)が適用されているものとします。

DEFINE DATA LOCAL 
  1 #DATE1 (D) INIT <D'1956-12-31'> 
  1 #DATE2 (D) 
END-DEFINE 
... 
STACK TOP DATA #DATE1 /* century information is lost (year 56 is stacked) 
... 
INPUT #DATE2          /* 56 is assumed to be in current century -> 2056 
... 
/* Result: NAT1130 runtime error (Unintended century switch...)

この場合、世紀情報は(意図しない値に)変更されます。ただし、この変更は DFSTACK=C 設定によってインターセプトされます。

例 4:

以下の例では、現在の年は 2014 年で、パラメータの設定には DFSTACK=C および YSLW=60 が適用されているものとします。

DEFINE DATA LOCAL 
  1 #DATE1 (D) INIT <D'2056-12-31'> 
  1 #DATE2 (D) 
END-DEFINE 
... 
STACK TOP DATA #DATE1 /* century information is lost (year 56 is stacked) 
... 
INPUT #DATE2          /* year sliding window determines 56 to be 1956 
... 
/* Result: NAT1130 runtime error (Unintended century switch...)

この場合、世紀情報は年スライディングウィンドウに従って変更されます。ただし、この変更は DFSTACK=C 設定によってインターセプトされます。

年固定ウィンドウ

このトピックの詳細については、プロファイルパラメータ YSLW の説明を参照してください。

デフォルトページタイトル用の日付フォーマット - DFTITLE パラメータ

セッション/プロファイルパラメータ DFTITLE によって、デフォルトのページタイトルDISPLAYWRITEPRINT の各ステートメントの出力)の日付フォーマットが決まります。

DFTITLE パラメータでは、以下の日付表現の 1 つを選択できます。

DFTITLE=S 2 桁の年とデリミタを使用する 8 バイトの表記です。例:yy-mm-dd
DFTITLE=L 4 桁の年とデリミタを使用する 10 バイトの表記です。例:yyyy-mm-dd
DFTITLE=I 4 桁の年(デリミタなし)を使用する 8 バイトの表記です。例:yyyymmdd

DFTITLE 設定に対する、年、月、日の順序、および使用するデリミタ文字は、DTFORM パラメータによって決まります。

DFTITLE パラメータは、Natural パラメータモジュール/ファイル内で、または Natural を起動するときにダイナミックに、あるいはシステムコマンド GLOBALS を使用してセッションレベルで設定できます。これは、ランタイム時に評価されます。

例:

この例では、DTFORM=I が適用されると仮定します。

WRITE 'HELLO' 
END
/* 
/* Date in page title if DFTITLE=S is set ...: 14-01-31 
/* Date in page title if DFTITLE=L is set ...: 2014-01-31
/* Date in page title if DFTITLE=I is set ...: 20140131

注意:
DFTITLE パラメータは、WRITE TITLE ステートメントで指定されているユーザー定義のページタイトルには効果がありません。