|
Here is some more relevant information from the latest Club Tech from AS/400 Network QUOTE 3. POTENTIAL DATE ARITHMETIC GOTCHA EXPOSED Several readers wrote in to report a bug in the way RPG handles data arithmetic, specifically citing that the SubDur op-code intermittently returns erroneous information. Readers reported that the problem sometimes occurs when subtracting the end of one month from the end of another month and requesting the result in terms of months. For example, subtracting the end of March from the end of April returns the value 0 rather than 1 for the number of months. Consider the following code: C DateFld1 SubDur DateFld2 Months:*M When field DateFld1 is April 30, 2001 (2001-04-30) and field DateFld2 is March 31, 2001 (2001-03-31), field Months contains the value 0 rather than 1. Though some expected a PTF to fix the problem, this is not a bug! RPG is working exactly as designed. It is important to note this behavior so that your applications work properly. As you'll soon see, it is possible to first add a specific duration to a date and then subtract that same duration with the resulting date not equaling the original date! >From the ILE RPG Reference: A month can contain 28, 29, 30, or 31 days. A year can contain 365 or 366 days. Because of this inconsistency, the following operations can give unexpected results: * Adding or subtracting a number of months (or calculating a duration in months) with a date that is on the 29th, 30th, or 31st of a month * Adding or subtracting a number of years (or calculating a duration in years) with a February 29 date. The following rules are used: * When months or years are added or subtracted, the day portion remains unchanged if possible. For example, 2000-03-15 + %MONTHS(1) is 2000-04-15. * If the addition or subtraction would produce a nonexistent date (for example, April 31), the last day of the month is used instead. * Any month or year operation that changes the day portion is not reversible. For example, 2000-03-31 + %MONTHS(1) is 2000-04-30 changes the day from 31 to 30. You cannot get back the original 2000-03-31 by subtracting one month. The operation 2000-03-31 + %MONTHS(1) - %MONTHS(1) becomes 2000-03-30. * The duration between two dates is one month if the later date minus one month gives the first date. For example, the duration in months (rounded down) between 2000-03-31 and 2000-04-30 is 0 because 2000-04-30 - %MONTHS(1) is 2000-03-30 (not 2000-03-31). UNQUOTE MacWheel99@aol.com (Alister Wm Macintyre) (Al Mac) BPCS 405 CD Manager / Programmer @ Global Wire Technologies Incorporated http://www.globalwiretechnologies.com = new name same quality wire engineering company: fax # 812-424-6838
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.