当factor2中指定的所有位都为on时,N3=*on
例(TESTB):
* The field bit settings are FieldF = 00000001, and FieldG = 11110001. * Indicator 16 is set on because bit 3 is off (0) in FieldF. * Indicator 17 is set off. C TESTB '3' FieldF 16 17 * Indicator 16 is set on because both bits 3 and 6 are off (0) in * FieldF. Indicators 17 and 18 are set off.
C TESTB '36' FieldF 161718 * Indicator 17 is set on because bit 3 is off (0) and bit 7 is on * (1) in FLDF. Indicators 16 and 18 are set off.
C TESTB '37' FieldF 161718 * Indicator 17 is set on because bit 7 is on (1) in FLDF. * Indicator 16 is set off. C TESTB '7' FieldF 16 17 * Indicator 17 is set on because bits 0,1,2, and 3 are off (0) and * bit 7 is on (1). Indicators 16 and 18 are set off. C TESTB FieldG FieldF 161718 * The hexadecimal literal X'88' (10001000) is used in factor 2. * Indicator 17 is set on because at least one bit (bit 0) is on * Indicators 16 and 18 are set off.
C TESTB X'88' FieldG 161718
新增日期、时间操作
增加ADDDUR, EXTRCT, SUBDUR, TEST等日期操作。
ADDDUR
计算Factor1/Result加上一段时间后的时间。 N1 N2 N3 C 原时间 ADDDUR(E) 时间段:类型 结果 ER Factor1可以是日期、时间、时间戳类型的变量,当没有指定Factor1时,result将被用作factor1。 Factor2必须是numeric类型的变量,不能含有小数位。Factor2可以是负数,此时实际上是在做减操作。Factor2由两部分组成,两部分使用”:”分割。第一部分是时间,第二部分使用来表示时间类型的关键字。 当Factor1中不是一个有效的时间,或者当没有指定factor1而且result没有指定一个有效的时间值时,此指令会运行出错。我们可以使用两种方式检查指令执行地是否正确:
61676237.doc – 第 31 页 共 39 页
在此指令执行完成后检查指示器。
在adddur后面使用”(E)”,在执行完此指令后检查%ERROR是否为*ON。
HKeywords+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ H TIMFMT(*USA) DATFMT(*MDY&)
DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++
DDateconst C CONST(D'12 31 92') * Define a Date field and initialize DLoandate S D DATFMT(*EUR) INZ(D'12 31 92') DDuedate S D DATFMT(*ISO) Dtimestamp S Z Danswer S T * Determine a DUEDATE which is xx years, yy months, zz days later * than LOANDATE. C LOANDATE ADDDUR XX:*YEARS DUEDATE C ADDDUR YY:*MONTHS DUEDATE C ADDDUR ZZ:*DAYS DUEDATE * Determine the date 23 days later C ADDDUR 23:*D DUEDATE * Add a 1234 microseconds to a timestamp C ADDDUR 1234:*MS timestamp * Add 12 HRS and 16 minutes to midnight C T'00:00 am' ADDDUR 12:*Hours answer C ADDDUR 16:*Minutes answer * Subtract 30 days from a loan due date
C ADDDUR -30:*D LOANDUE
EXTRACT
从time/timestamp/date变量中截取年/月/日/小时/分钟/秒钟/微秒 N1 N2 N3 C EXTRCT(E) 时间:类型 结果 ER
结果字段可以是数值类型也可以是字符类型。 错误检查方法与ADDDUR相同。 例:
D LOGONDATE S D
D DATE_STR S 15 D MONTHS S 8 DIM(12) CTDATA
* Move the job date to LOGONDATE. By default, LOGONDATE has an *ISO * date format, which contains a 4-digit year. *DATE also contains a * 4-digit year, but in a different format, *USA. C *USA MOVE *DATE LOGONDATE * Extract the month from a date field to a 2-digit field
61676237.doc – 第 32 页 共 39 页
* that is used as an index into a character array containing * the names of the months. Then extract the day from the * timestamp to a 2-byte character field which can be used in * an EVAL concatenation expression to form a string. * For example, if LOGONDATE is March 17, 1996, LOGMONTH will * contain 03, LOGDAY will contain 17, and DATE_STR will contain * 'March 17'. C EXTRCT LOGONDATE:*M LOGMONTH 2 0 C EXTRCT LOGONDATE:*D LOGDAY 2 C EVAL DATE_STR = %TRIMR(MONTHS(LOGMONTH)) C + ' ' + LOGDAY C SETON LR ** CTDATA MONTHS January February March April May June July August September October November
December
SUBDUR:计算两个时间之间的间隔时间或者是某一时间之前一段时间。
C
OR C
DATE/TIME/TIMESTAMP SUBDUR DURATION:DURATION_CODE
DATE/TIME/TIMESTAMP
错误判断方法与ADDDUR同
例:
* Determine a LOANDATE which is xx years, yy months, zz days prior to * the DUEDATE. C DUEDATE SUBDUR XX:*YEARS LOANDATE C SUBDUR YY:*MONTHS LOANDATE C SUBDUR ZZ:*DAYS LOANDATE * Add 30 days to a loan due date
C SUBDUR -30:*D LOANDUE * Calculate the number or days between a LOANDATE and a DUEDATE. C LOANDATE SUBDUR DUEDATE NUM_DAYS:*D 5 0 * Determine the number of seconds between LOANDATE and DUEDATE.
C LOANDATE SUBDUR DUEDATE NUM_SECS:*S 5 0 例:
DATE/TIME/TIMESTAMP SUBDUR DATE/TIME/TIMESTAMP DURATION:DURATION_CODE
61676237.doc – 第 33 页 共 39 页
D CURDATE S D DATFMT(*ISO) C C*ADDDUR C TIME CURDATE C CURDATE DSPLY C ADDDUR 1:*Y CURDATE C CURDATE DSPLY C ADDDUR 1:*M CURDATE C CURDATE DSPLY C ADDDUR 1:*D CURDATE C CURDATE DSPLY C*EXTRCT C TIME CURDATE C EXTRCT CURDATE:*Y YEAR 4 0 C YEAR DSPLY C EXTRCT CURDATE:*M MONTH 2 0 C MONTH DSPLY C EXTRCT CURDATE:*D DAY 2 0 C DAY DSPLY C*SUBDUR C TIME CURDATE C CURDATE DSPLY C SUBDUR 1:*Y CURDATE C CURDATE DSPLY C SUBDUR 1:*M CURDATE C CURDATE DSPLY C SUBDUR 1:*D CURDATE C CURDATE DSPLY C C C ENDPGM TAG C EVAL *INLR = '1' C RETURN
TEST
检查一个DATE/TIME/TIMESTAMP变量是否搬含有效的值。
如果我们要检查的一个变量是DATE/TIME/TIMESTAMP类型的变量,那么: C DATE/TIME/TIMESTAMP FORMATE TEST(E) C DATE FORMATE C TIME FORMATE 例:
TEST(DE) TEST(ET) TEST(EZ)
DATE/TIME/TIMESTAMP
如果我们要检查的是一个Char/Num类型的变量,那么:
DATE TIME
C TIMESTAMPE FORMATE TIMESTAMP
61676237.doc – 第 34 页 共 39 页
* Indicator 18 will not be set on, since the character field is a * valid *ISO timestamp field, without separators. C *ISO0 TEST (Z) Char_TSGMp 18 * Indicator 19 will not be set on, since the character field is a * valid *MDY date, without separators.
C *MDY0 TEST (D) Char_Date 19 * %ERROR will return '1', since Num_Date is not *DMY. C *DMY TEST (DE) Num_Date * No Factor 1 since result is a D data type field * %ERROR will return '0', since the field * contains a valid date C TEST (E) Datefield * In the following test, %ERROR will return '1' since the * Timefield does not contain a valid USA time. C *USA TEST (ET) Char_Time * In the following test, indicator 20 will be set on since the * character field is a valid *CMDY, but there are separators. C *CMDY0 TEST (D) char_date2 20 * In the following test, %ERROR will return '0' since * the character field is a valid *LONGJUL date. C *LONGJUL TEST (DE) char_date3
时间类型关键字:
*YEARS for the year (*Y)
*MONTHS for the month (*M)
*DAYS for the day of the month (*D)
*HOURS for the hours (*H)
*MINUTES for the minutes (*MN)
*SECONDS for the seconds (*S)
61676237.doc – 第 35 页 共 39 页