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')
説明
日付
移動する日付です。完全な構成要素フォーマットの日付である必要があります (例、MDYY、YYJUL)。
文字
日付を移動する有効な位置です。一重引用符 (') で囲みます。無効な位置を指定すると、リターンコード 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