DATEMOV - 日付を指定の位置に移動

DATEMOV 関数は、日付を有効な位置に移動します。

注意:週のはじめ (BOW) を使用すると、常に月曜日が返され、週の終わり (EOW) を使用すると、常に金曜日が返されます。また、DATEMOV 関数で使用される日付が土曜日または日曜日になる場合、この関数で実際に使用される日付は翌月曜日に移動します。日付を土曜日または日曜日から月曜日に移動した演算を回避したい場合、または BOW を日曜日、EOW を土曜日にする場合は、DTRUNC 関数を使用することができます。

ダイアログマネージャでは日付が文字または数値として解釈され、また DATEMOV 関数では基準日からのオフセットとして格納された標準日付を使用する必要があることから、ダイアログマネージャでは DATEMOV 関数を使用しないでください。ただし、入力日付として使用する変数を、基準日からのオフセットに事前に変換した場合を除きます。たとえば、次のように関数を実行すると、整数のレガシー日付 20050131 が日付フォーマット (SmartDate) に変換され、1 か月が加算された上で、結果が文字のレガシー日付に変換されます。

-SET &STRT=DATECVT(20050131,'I8YYMD', 'YYMD');         
-SET &NMT=DATEADD(&STRT,'M',1);                        
-SET &NMTA=DATECVT(&NMT,'YYMD','A8MTDYY');             
-TYPE A MONTH FROM 20050131 IS &NMTA 

出力結果では、DATEADD 関数により、1 月末日から翌月の末日までの日数として、2 月の実際の日数が追加されています。

A MONTH FROM 20050131 IS 02282005

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

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

日付を指定の位置に移動

DATEMOV(date, 'move-point')

説明

date

日付

移動する日付です。完全な構成要素フォーマットの日付である必要があります (例、MDYY、YYJUL)。

move-point

文字

日付を移動する有効な位置です。一重引用符 (') で囲みます。無効な位置を指定すると、リターンコード 0 (ゼロ) が返されます。有効な値には、次のものがあります。

  • EOM   月の終わりです。
  • BOM   月のはじめです。
  • EOQ   四半期の終わりです。
  • BOQ   四半期のはじめです。
  • EOY   年の終わりです。
  • BOY   年のはじめです。
  • EOW   週の終わりです。
  • BOW   週のはじめです。
  • NWD   次の平日です。
  • NBD   次の営業日です。
  • PWD   先週の平日です。
  • PBD   前回の営業日です。
  • WD-   平日またはそれ以前です。
  • BD-   営業日またはそれ以前です。
  • WD+   平日またはそれ以降です。
  • BD+   営業日またはそれ以降です。

営業日の計算には、BUSDAYS および HDAY パラメータの設定が反映されます。

DATEADD 関数が次の営業日または前の営業日を計算する場合、常に営業日を基準に計算を開始します。そのため、実際の日が土曜日または日曜日の場合に、リクエストで次の営業日を計算すると、この関数は土曜日または日曜日の代わりに月曜日を開始日として使用し、次の営業日として火曜日を返します。同様に、前の営業日を計算する際は、開始日として金曜日を使用し、前の営業日として木曜日を返します。

営業日のスキップ (開始日の繰り上げまたは繰り下げ) を回避するには、DATEMOV を使用します。次の営業日を返すには、最初に BD- または WD- を使用して、前の営業日に移動します (実際の日がすでに営業日の場合、その日は移動されません)。次に DATEADD を使用して、次の営業日に移動します。前の営業日を返すには、最初に BD+ または WD+ を使用して、次の営業日に移動します (実際の日がすでに営業日の場合、その日は移動されません)。次に DATEADD を使用して、前の営業日に移動します。

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

次の営業日を取得

この例では、正しい結果を取得するために、DATEMOV 関数を使用する必要性について説明します。

次のリクエストは、GGSALES データソースに対して実行され、DATE フィールドに BD (営業日) 移動点を使用します。最初に DATE が日付フォーマット (SmartDate) に変換され、次に BD 移動点が指定された DATEADD が呼び出されます。

DEFINE FILE GGSALES  
DT1/WMDYY=DATE;                                                        
DT2/WMDYY = DATEADD(DT1 ,'BD',1);                                         
DAY/Dt = DT1;
 END                                                                       
 
TABLE FILE GGSALES                                                        
SUM  DT1 
DT2
BY DT1 NOPRINT
WHERE RECORDLIMIT EQ 10                                                 
 END  

日付が土曜日または日曜日の場合、次の営業日は火曜日として返されます。これは、計算の実行前に元の日付が営業日に移動されたためです。

  DT1              DT2   
  ---              ---         
  SUN, 09/01/1996  TUE, 09/03/1996
  FRI, 11/01/1996  MON, 11/04/1996
  SUN, 12/01/1996  TUE, 12/03/1996
  SAT, 03/01/1997  TUE, 03/04/1997
  TUE, 04/01/1997  WED, 04/02/1997
  THU, 05/01/1997  FRI, 05/02/1997
  SUN, 06/01/1997  TUE, 06/03/1997
  MON, 09/01/1997  TUE, 09/02/1997
  WED, 10/01/1997  THU, 10/02/1997

次のリクエストでは、DATEMOV が呼び出され、開始日が営業日に設定されます。この呼び出しで指定された移動点は BD- です。この場合、元の日付が営業日でない場合にのみ、日付が前の営業日に移動されます。次に DATEADD が呼び出され、BD 移動点を使用して次の営業日を返します。

DEFINE FILE GGSALES  
DT1/WMDYY=DATE;                                                        
DT1A/WMDYY=DATEMOV(DT1, 'BD-');                                           
DT2/WMDYY = DATEADD(DT1A,'BD',1);                                         
DAY/Dt = DT1;
 END                                                                       
 
TABLE FILE GGSALES                                                        
SUM  DT1 DT1A DT2
BY DT1 NOPRINT
WHERE RECORDLIMIT EQ 10                                                 
 END 

出力結果では、土曜日または日曜日の次の営業日として月曜日が返されています。

DT1              DT1A             DT2   
  ---              ----             ---            
  SUN, 09/01/1996  FRI, 08/30/1996  MON, 09/02/1996
  FRI, 11/01/1996  FRI, 11/01/1996  MON, 11/04/1996
  SUN, 12/01/1996  FRI, 11/29/1996  MON, 12/02/1996
  SAT, 03/01/1997  FRI, 02/28/1997  MON, 03/03/1997
  TUE, 04/01/1997  TUE, 04/01/1997  WED, 04/02/1997
  THU, 05/01/1997  THU, 05/01/1997  FRI, 05/02/1997
  SUN, 06/01/1997  FRI, 05/30/1997  MON, 06/02/1997
  MON, 09/01/1997  MON, 09/01/1997  TUE, 09/02/1997
  WED, 10/01/1997  WED, 10/01/1997  THU, 10/02/1997

DEFINE FUNCTION を使用して週のはじめに日付を移動

次の BOWK という名前の DEFINE FUNCTION は、特定の日付および週のはじめと認識される曜日名を取得し、週のはじめに該当する日付を返します。

DEFINE FUNCTION BOWK(THEDATE/MDYY,WEEKSTART/A10) 	 
DAYOFWEEK/W=THEDATE; 	 
DAYNO/I1=IF DAYOFWEEK EQ 7 THEN 0 ELSE DAYOFWEEK; 	 
FIRSTOFWK/I1=DECODE WEEKSTART('SUNDAY' 0 'MONDAY' 1 'TUESDAY' 2 	 
'WEDNESDAY' 3 'THURSDAY' 4 'FRIDAY' 5 'SATURDAY' 6 	 
'SUN' 0 'MON' 1 'TUE' 2 'WED' 3 'THU' 4 'FRI' 5 'SAT' 6); 	 
BOWK/MDYY=IF DAYNO GE FIRSTOFWK THEN THEDATE-DAYNO+FIRSTOFWK 	 
ELSE THEDATE-7-DAYNO+FIRSTOFWK; 	 
END

次のリクエストは、BOWK 関数を使用して、DT1 フィールドのそれぞれの値に対して、週のはじめに該当する日付 (DT2) を返します。

DEFINE FILE GGSALES  
DT1/WMDYY=DATE;                                                        
DT2/WMDYY = BOWK(DT1 ,'SUN');                                         
 END                                                                       
 
TABLE FILE GGSALES                                                        
SUM  DT1 
DT2
BY DT1 NOPRINT
WHERE RECORDLIMIT EQ 10 
ON TABLE SET PAGE NOLEAD                                                
END  

下図は、出力結果を示しています。

日付を有効な位置に移動

BUSDAYS パラメータは、営業日を月曜日、火曜日、水曜日、および木曜日に設定します。DATECVT 関数は、レガシー日付の HIRE_DATE を日付フォーマット YYMD に変換し、日付表示オプションを指定します。DATEMOV 関数は、HIRE_DATE の有効な移動先を決定します。

SET BUSDAY = _MTWT__
TABLE FILE EMPLOYEE
PRINT
COMPUTE NEW_DATE/YYMD = DATECVT(HIRE_DATE, 'I6YMD', 'YYMD'); AND
COMPUTE NEW_DATE/WT = DATECVT(HIRE_DATE, 'I6YMD', 'WT'); AS 'DOW' AND
COMPUTE NWD/WT = DATEMOV(NEW_DATE, 'NWD'); AND
COMPUTE PWD/WT = DATEMOV(NEW_DATE, 'PWD'); AND
COMPUTE WDP/WT = DATEMOV(NEW_DATE, 'WD+'); AS 'WD+' AND
COMPUTE WDM/WT = DATEMOV(NEW_DATE, 'WD-'); AS 'WD-' AND
COMPUTE NBD/WT = DATEMOV(NEW_DATE, 'NBD'); AND
COMPUTE PBD/WT = DATEMOV(NEW_DATE, 'PBD'); AND
COMPUTE WBP/WT = DATEMOV(NEW_DATE, 'BD+'); AS 'BD+' AND
COMPUTE WBM/WT = DATEMOV(NEW_DATE, 'BD-'); AS 'BD-' BY LAST_NAME NOPRINT
HEADING
"Examples of DATEMOV"
"Business days are Monday, Tuesday, Wednesday, + Thursday "
" "
"START DATE.. | MOVE POINTS..........................."
WHERE DEPARTMENT EQ 'MIS';
END

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

Examples of DATEMOV
Business days are Monday, Tuesday, Wednesday, + Thursday
START DATE.. | MOVE POINTS...........................
NEW_DATE    DOW  NWD  PWD  WD+  WD-  NBD  PBD  BD+  BD-
--------    ---  ---  ---  ---  ---  ---  ---  ---  ---
1982/04/01  THU  FRI  WED  THU  THU  MON  WED  THU  THU
1981/11/02  MON  TUE  FRI  MON  MON  TUE  THU  MON  MON
1982/04/01  THU  FRI  WED  THU  THU  MON  WED  THU  THU
1982/05/01  SAT  TUE  THU  MON  FRI  TUE  WED  MON  THU
1981/07/01  WED  THU  TUE  WED  WED  THU  TUE  WED  WED
1981/07/01  WED  THU  TUE  WED  WED  THU  TUE  WED  WED

週の最終日を特定

DATEMOV 関数は、NEW_DATE 内の各日付の週の最終日を特定し、結果を EOW に格納します。

TABLE FILE EMPLOYEE
PRINT FIRST_NAME AND
COMPUTE NEW_DATE/YYMDWT = DATECVT(HIRE_DATE, 'I6YMD', 'YYMDWT'); AND
COMPUTE EOW/YYMDWT = DATEMOV(NEW_DATE, 'EOW');
BY LAST_NAME
WHERE DEPARTMENT EQ 'PRODUCTION';
END

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

LAST_NAME     FIRST_NAME  NEW_DATE          EOW
---------     ----------  --------          ---
BANNING       JOHN        1982 AUG  1, SUN  1982 AUG  6, FRI
IRVING        JOAN        1982 JAN  4, MON  1982 JAN  8, FRI
MCKNIGHT      ROGER       1982 FEB  2, TUE  1982 FEB  5, FRI
ROMANS        ANTHONY     1982 JUL  1, THU  1982 JUL  2, FRI
SMITH         RICHARD     1982 JAN  4, MON  1982 JAN  8, FRI
STEVENS       ALFRED      1980 JUN  2, MON  1980 JUN  6, FRI