!*********************************************************************** ! * ! Confidentiality Information: * ! * ! This module is the confidential and proprietary information of * ! PeopleSoft, Inc.; it is not to be copied, reproduced, or transmitted * ! in any form, by any means, in whole or in part, nor is it to be used * ! for any purpose other than that for which it is expressly provided * ! without the written permission of PeopleSoft. * ! * ! Copyright (c) 1988-2005 PeopleSoft, Inc. All Rights Reserved * ! * !*********************************************************************** ! * ! SourceSafe Information: * ! * ! $Header:: /pt843/SQR/DATEMATH.SQC 8 2/19/03 11:48p Ptadm $* ! * !*********************************************************************** ! SQR date arithmetic procedures. These were written to support PeopleSoft ! SQRs that require date functionality that is compatible across platforms. ! Date formats used in this routine is YYYY-MM-DD. ! ************************************************************************* ! IMPORTANT NOTE: 08/17/94 ! In the procedure dtu-format-date, the sqc has hardcoded '-' as the ! delimiter for the dates. This is incorrect. In the HRMS 4.0 release, ! all sqrs that use this procedure has extra code to work around this problem. ! In future release, the procedure will be corrected and all the sqrs using ! the procedure will be revised to remove the extra code. ! Please note that if you use this procedure and you add code to workaround ! the problem, when the sqc is fixed, you will also need to revise all your ! code. ! ************************************************************************* !************************************************************************** ! Convert-To-DTU-Date ! Input: $date_in (native format) ! Output: $dtu_date (YYYY-MM-DD format) !************************************************************************** begin-procedure Convert-To-DTU-Date($date_in, :$dtu_date) #ifdef debugx display 'Entering DATEMATH.SQC: Convert-To-DTU-Date' display ' Input $date_in: ' noline display $date_in #end-if let $_Year4 = '1' let $_MMLZero = '1' let $_DDelimiter = '-' do Format-DateTime($date_in, $dtu_date, {DEFYMD},'','') #ifdef debugx display 'Exiting DATEMATH.SQC: Convert-To-DTU-Date' display ' Output $dtu_date: ' noline display $dtu_date #end-if end-procedure !************************************************************************** ! Convert-From-DTU-Date ! Input: $dtu_date (YYYY-MM-DD format) ! Output: $date_out (native format) !************************************************************************** begin-procedure Convert-From-DTU-Date($dtu_date, :$date_out) #ifdef debugx display 'Entering DATEMATH.SQC: Convert-From-DTU-Date' display ' Input $dtu_date: ' noline display $dtu_date #end-if let $_Year4 = '1' let $_MMLZero = '1' let $_DDelimiter = '-' do Format-DateTime($dtu_date, $date_out, {DEFYMD},'','native') #ifdef debugx display 'Exiting DATEMATH.SQC: Convert-From-DTU-Date' display ' Output $date_out: ' noline display $date_out #end-if end-procedure !************************************************************************** ! dtu-parse-date ! Input: $dtu_date (YYYY-MM-DD) ! Output: #dtu_yr, #dtu_mo, #dtu_da !************************************************************************** begin-procedure dtu-parse-date($dtu_date, :#dtu_yr, :#dtu_mo, :#dtu_da) #ifdef debugx display 'Entering DATEMATH.SQC: dtu-parse-date' display ' Input $dtu_date: ' noline display $dtu_date #end-if let #dtu_yr = to_number(substr($dtu_date, 1, 4)) let #dtu_mo = to_number(substr($dtu_date, 6, 2)) let #dtu_da = to_number(substr($dtu_date, 9, 2)) #ifdef debugx display 'Exiting DATEMATH.SQC: dtu-parse-date' display ' Output #dtu_yr: ' noline display #dtu_yr display ' Output #dtu_mo: ' noline display #dtu_mo display ' Output #dtu_da: ' noline display #dtu_da #end-if end-procedure !************************************************************************** ! dtu-format-date ! Input: #dtu_yr, #dtu_mo, #dtu_da ! Output: $dtu_date !************************************************************************** begin-procedure dtu-format-date(#dtu_yr, #dtu_mo, #dtu_da, :$dtu_date) #ifdef debugx display 'Entering DATEMATH.SQC: dtu-format-date' display ' Input #dtu_yr: ' noline display #dtu_yr display ' Input #dtu_mo: ' noline display #dtu_mo display ' Input #dtu_da: ' noline display #dtu_da #end-if let $dtu_date = edit(#dtu_yr, '0000') || '-' || edit(#dtu_mo, '00') || '-' || edit(#dtu_da, '00') #ifdef debugx display 'Exiting DATEMATH.SQC: dtu-format-date' display ' Output $dtu_date: ' noline display $dtu_date #end-if end-procedure !************************************************************************** ! dtu-ymd-to-ser ! Input: #dtu_yr, #dtu_mo, #dtu_da ! Output: #dtu_ser !************************************************************************** begin-procedure dtu-ymd-to-ser(#dtu_yr, #dtu_mo, #dtu_da, :#dtu_ser) #ifdef debugx display 'Entering DATEMATH.SQC: dtu-ymd-to-ser' display ' Input #dtu_yr: ' noline display #dtu_yr display ' Input #dtu_mo: ' noline display #dtu_mo display ' Input #dtu_da: ' noline display #dtu_da #end-if if #dtu_mo < 3 let #dtu_wk_mo = #dtu_mo + 9 let #dtu_wk_yr = #dtu_yr - 1 else let #dtu_wk_mo = #dtu_mo - 3 let #dtu_wk_yr = #dtu_yr end-if let #dtu_ser = floor((146097 * floor(#dtu_wk_yr / 100)) / 4) + floor((1461 * (#dtu_wk_yr % 100)) / 4) + floor((153 * #dtu_wk_mo + 2) / 5) + #dtu_da #ifdef debugx display 'Exiting DATEMATH.SQC: dtu-ymd-to-ser' display ' Output #dtu_ser: ' noline display #dtu_ser #end-if end-procedure !************************************************************************** ! dtu-ser-to-ymd ! Input: #dtu_ser ! Output: #dtu_yr, #dtu_mo, #dtu_da !************************************************************************** begin-procedure dtu-ser-to-ymd(#dtu_ser, :#dtu_yr, :#dtu_mo, :#dtu_da) #ifdef debugx display 'Entering DATEMATH.SQC: dtu-ser-to-ymd' display ' Input #dtu_ser: ' noline display #dtu_ser #end-if let #dtu_wk_ser = #dtu_ser let #dtu_cent = floor(( 4 * #dtu_wk_ser - 1) / 146097) let #dtu_wk_ser = floor(((4 * #dtu_wk_ser - 1) % 146097) / 4) let #dtu_yr = floor(( 4 * #dtu_wk_ser + 3) / 1461) + 100 * #dtu_cent let #dtu_wk_ser = floor(((4 * #dtu_wk_ser + 3) % 1461) / 4) + 1 let #dtu_mo = floor(( 5 * #dtu_wk_ser - 3) / 153) let #dtu_da = floor(((5 * #dtu_wk_ser - 3) % 153) / 5) + 1 if #dtu_mo < 10 let #dtu_mo = #dtu_mo + 3 else let #dtu_mo = #dtu_mo - 9 let #dtu_yr = #dtu_yr + 1 end-if #ifdef debugx display 'Exiting DATEMATH.SQC: dtu-ser-to-ymd' display ' Output #dtu_yr: ' noline display #dtu_yr display ' Output #dtu_mo: ' noline display #dtu_mo display ' Output #dtu_da: ' noline display #dtu_da #end-if end-procedure !************************************************************************** ! dtu-add-days ! Input: $dtu_date, #dtu_days ! Output: $dtu_date !************************************************************************** begin-procedure dtu-add-days($dtu_date, #dtu_days, :$dtu_date_out) declare-variable date $wkDate end-declare #ifdef debugx display 'Entering DATEMATH.SQC: dtu-add-days' display ' Input $dtu_date: ' noline display $dtu_date display ' Input #dtu_days: ' noline display #dtu_days #end-if let $wkDate = strtodate($dtu_date,{DTUDateFormat}) let $wkDate = dateadd($wkDate,'day',#dtu_days) let $dtu_date_out = datetostr($wkDate,{DTUDateFormat}) #ifdef debugx display 'Exiting DATEMATH.SQC: dtu-add-days' display ' Output $dtu_date_out: ' noline display $dtu_date_out #end-if end-procedure !************************************************************************** ! dtu-subtract-days ! Input: $dtu_date, #dtu_days ! Output: $dtu_date_out !************************************************************************** begin-procedure dtu-subtract-days($dtu_date, #dtu_days, :$dtu_date_out) declare-variable date $wkDate end-declare #ifdef debugx display 'Entering DATEMATH.SQC: dtu-subtract-days' display ' Input $dtu_date: ' noline display $dtu_date display ' Input #dtu_days: ' noline display #dtu_days #end-if let $wkDate = strtodate($dtu_date,{DTUDateFormat}) let $wkDate = dateadd($wkDate,'day',-#dtu_days) let $dtu_date_out = datetostr($wkDate,{DTUDateFormat}) #ifdef debugx display 'Exiting DATEMATH.SQC: dtu-subtract-days' display ' Output $dtu_date_out: ' noline display $dtu_date_out #end-if end-procedure !************************************************************************** ! dtu-add-weeks ! Input: $dtu_date, #dtu_weeks ! Output: $dtu_date_out !************************************************************************** begin-procedure dtu-add-weeks($dtu_date, #dtu_weeks, :$dtu_date_out) declare-variable date $wkDate end-declare #ifdef debugx display 'Entering DATEMATH.SQC: dtu-add-weeks' display ' Input $dtu_date: ' noline display $dtu_date display ' Input #dtu_weeks: ' noline display #dtu_weeks #end-if let $wkDate = strtodate($dtu_date,{DTUDateFormat}) let $wkDate = dateadd($wkDate,'week',#dtu_weeks) let $dtu_date_out = datetostr($wkDate,{DTUDateFormat}) #ifdef debugx display 'Exiting DATEMATH.SQC: dtu-add-weeks' display ' Output $dtu_date_out: ' noline display $dtu_date_out #end-if end-procedure !************************************************************************** ! dtu-add-months ! Input: $dtu_date, #dtu_months ! Output: $dtu_date_out !************************************************************************** begin-procedure dtu-add-months($dtu_date, #dtu_months, :$dtu_date_out) declare-variable date $wkDate end-declare #ifdef debugx display 'Entering DATEMATH.SQC: dtu-add-months' display ' Input $dtu_date: ' noline display $dtu_date display ' Input #dtu_months: ' noline display #dtu_months #end-if let $wkDate = strtodate($dtu_date,{DTUDateFormat}) let $wkDate = dateadd($wkDate,'month',#dtu_months) let $dtu_date_out = datetostr($wkDate,{DTUDateFormat}) #ifdef debugx display 'Exiting DATEMATH.SQC: dtu-add-months' display ' Output $dtu_date_out: ' noline display $dtu_date_out #end-if end-procedure !************************************************************************** ! dtu-add-years ! Input: $dtu_date, #dtu_years ! Output: $dtu_date_out !************************************************************************** begin-procedure dtu-add-years($dtu_date, #dtu_years, :$dtu_date_out) declare-variable date $wkDate end-declare #ifdef debugx display 'Entering DATEMATH.SQC: dtu-add-years' display ' Input $dtu_date: ' noline display $dtu_date display ' Input #dtu_years: ' noline display #dtu_years #end-if let $wkDate = strtodate($dtu_date,{DTUDateFormat}) let $wkDate = dateadd($wkDate,'year',#dtu_years) let $dtu_date_out = datetostr($wkDate,{DTUDateFormat}) #ifdef debugx display 'Exiting DATEMATH.SQC: dtu-add-years' display ' Output $dtu_date_out: ' noline display $dtu_date_out #end-if end-procedure !************************************************************************** ! dtu-month-begin ! Input: $dtu_date ! Output: $dtu_date_out !************************************************************************** begin-procedure dtu-month-begin($dtu_date, :$dtu_date_out) #ifdef debugx display 'Entering DATEMATH.SQC: dtu-month-begin' display ' Input $dtu_date: ' noline display $dtu_date #end-if let $dtu_date_out = substr($dtu_date, 1, 8) || '01' #ifdef debugx display 'Exiting DATEMATH.SQC: dtu-month-begin' display ' Output $dtu_date_out: ' noline display $dtu_date_out #end-if end-procedure !************************************************************************** ! dtu-month-end ! Input: $dtu_date ! Output: $dtu_date_out !************************************************************************** begin-procedure dtu-month-end($dtu_date, :$dtu_date_out) #ifdef debugx display 'Entering DATEMATH.SQC: dtu-month-end' display ' Input $dtu_date: ' noline display $dtu_date #end-if !Compute serial date of first of following month, subtract 1, and convert !back to ymd. do dtu-parse-date($dtu_date, #dtu_yr, #dtu_mo, #dtu_da) let #dtu_da = 1 if #dtu_mo = 12 let #dtu_mo = 1 let #dtu_yr = #dtu_yr + 1 else let #dtu_mo = #dtu_mo + 1 end-if do dtu-ymd-to-ser(#dtu_yr, #dtu_mo, #dtu_da, #dtu_ser) let #dtu_ser = #dtu_ser - 1 do dtu-ser-to-ymd(#dtu_ser, #dtu_yr, #dtu_mo, #dtu_da) do dtu-format-date(#dtu_yr, #dtu_mo, #dtu_da, $dtu_date_out) #ifdef debugx display 'Exiting DATEMATH.SQC: dtu-month-end' display ' Output $dtu_date_out: ' noline display $dtu_date_out #end-if end-procedure !************************************************************************** ! dtu-diff-days ! Input: $dtu_date1, $dtu_date2 ! Output: #dtu_days !************************************************************************** begin-procedure dtu-diff-days($dtu_date1, $dtu_date2, :#dtu_days) declare-variable date $wkDate1 date $wkDate2 integer #dtu_days end-declare #ifdef debugx display 'Entering DATEMATH.SQC: dtu-diff-days' display ' Input $dtu_date1: ' noline display $dtu_date1 display ' Input $dtu_date2: ' noline display $dtu_date2 #end-if let $wkDate1 = strtodate($dtu_date1,{DTUDateFormat}) let $wkDate2 = strtodate($dtu_date2,{DTUDateFormat}) let #dtu_days = trunc(datediff($wkDate2,$wkDate1,'day'),0) #ifdef debugx display 'Exiting DATEMATH.SQC: dtu-diff-days' display ' Output #dtu_days: ' noline display #dtu_days #end-if end-procedure !************************************************************************** ! dtu-diff-months ! Input: $dtu_date1 ("from"), $dtu_date2 ("to") ! Output: #dtu_months (non-negative if "to" >= "from") !************************************************************************** begin-procedure dtu-diff-months($dtu_date1, $dtu_date2, :#dtu_months) declare-variable date $wkDate1 date $wkDate2 integer #dtu_months end-declare #ifdef debugx display 'Entering DATEMATH.SQC: dtu-diff-months' display ' Input $dtu_date1: ' noline display $dtu_date1 display ' Input $dtu_date2: ' noline display $dtu_date2 #end-if let $wkDate1 = strtodate($dtu_date1,{DTUDateFormat}) let $wkDate2 = strtodate($dtu_date2,{DTUDateFormat}) let #dtu_months = trunc(datediff($wkDate2,$wkDate1,'month'),0) #ifdef debugx display 'Exiting DATEMATH.SQC: dtu-diff-months' display ' Output #dtu_months: ' noline display #dtu_months #end-if end-procedure !************************************************************************** ! dtu-diff-years ! Input: $dtu_date1 ("from"), $dtu_date2 ("to") ! Output: #dtu_years (non-negative if "to" >= "from") !************************************************************************** begin-procedure dtu-diff-years($dtu_date1, $dtu_date2, :#dtu_years) declare-variable date $wkDate1 date $wkDate2 integer #dtu_years end-declare #ifdef debugx display 'Entering DATEMATH.SQC: dtu-diff-years' display ' Input $dtu_date1: ' noline display $dtu_date1 display ' Input $dtu_date2: ' noline display $dtu_date2 #end-if let $wkDate1 = strtodate($dtu_date1,{DTUDateFormat}) let $wkDate2 = strtodate($dtu_date2,{DTUDateFormat}) let #dtu_years = trunc(datediff($wkDate2,$wkDate1,'year'),0) #ifdef debugx display 'Exiting DATEMATH.SQC: dtu-diff-years' display ' Output #dtu_years: ' noline display #dtu_years #end-if end-procedure !************************************************************************** ! dtu-dayofweek# ! Input: $dtu_date ("from") ! Output: #dtu_dayofweek (Sunday = 1) !************************************************************************** begin-procedure dtu-dayofweek#($dtu_date, :#dtu_dayofweek) declare-variable date $wkDate end-declare #ifdef debugx display 'Entering DATEMATH.SQC: dtu-dayofweek#' display ' Input $dtu_date: ' noline display $dtu_date #end-if let $wkDate = strtodate($dtu_date,{DTUDateFormat}) let #dtu_dayofweek = to_number(datetostr($wkDate,'D')) #ifdef debugx display 'Exiting DATEMATH.SQC: dtu-dayofweek#' display ' Output #dtu_dayofweek: ' noline display #dtu_dayofweek #end-if end-procedure !************************************************************************** ! dtu-dayofweek$ ! Input: $dtu_date ("from"), $dtu_date2 ("to") ! Output: $dtu_dayofweek (day-of-week string) !************************************************************************** begin-procedure dtu-dayofweek$($dtu_date, :$dtu_dayofweek) declare-variable date $wkDate end-declare #ifdef debugx display 'Entering DATEMATH.SQC: dtu-dayofweek$' display ' Input $dtu_date: ' noline display $dtu_date #end-if let $wkDate = strtodate($dtu_date,{DTUDateFormat}) let $dtu_dayofweek = datetostr($wkDate,'Day') #ifdef debugx display 'Exiting DATEMATH.SQC: dtu-dayofweek$' display ' Output $dtu_dayofweek: ' noline display $dtu_dayofweek #end-if end-procedure