Hi,
This is the code i originally had and this is what i replaced with. both are
hogging a lot of time.
sub calcmonth_old
{
my $string1 = shift;
my $string2=shift;
my $date1 = ParseDate($string2);
my $date2 = ParseDate($string1);
my $err = "";
my $delta = DateCalc($date1,$date2,\$err,1);
# YY:MM:WK:DD:HH:MM:SS the years, months, etc. between the two
$delta=~ s/\+|\-//;
my ($year,$month,$wk,$dd,$hh,$mm,$ss)= split(/:/,$delta);
$month = ($year * 12)+$month;
return $month;
}
sub calcmonth
{
my $string1=shift;
my $string2=shift;
if(trim($string1) eq "" or trim($string2) eq "")
{
return "";
}
my $string1 = str_pad($string1,8,"01",1);
my $string2 = str_pad($string2,8,"01",1);
my $err = "";
if($string1 < $string2)
{
($string1,$string2)=($string2,$string1);
}
my $year1 = substr($string1,0,4);
my $year2 = substr($string2,0,4);
my $month1= substr($string1,4,2);
my $month2= substr($string2,4,2);
my $day1 = substr($string1,6,2);
my $day2 = substr($string2,6,2);
my $monthDiff =0;
while($string2 < $string1)
{
my ($year,$month,$day) =
Add_Delta_YM($year2,$month2,$day2,
0,1);
$string2 = $year.str_pad($month,2,"0",2).str_pad($day,2,"0",2);
if($string2 <= $string1)
{
$monthDiff++;
$year2 = substr($string2,0,4);
$month2= substr($string2,4,2);
$day2 = substr($string2,6,2);
}
}
return $monthDiff;
}
use constant STR_PAD_RIGHT => 1;
use constant STR_PAD_LEFT => 2;
use constant STR_PAD_BOTH => 3;
sub str_pad
{
my $input =shift;
my $length = shift;
my $pad = shift;
my $options = shift;
return $input if $length < length $input;
# Work out where to place our string.
my $start = 0;
my $diff = $length - length $input;
my $rv;
if($options==undef)
{
$options=STR_PAD_RIGHT;#default argument is Right pad
}
if($pad eq undef)
{
$pad=" ";#default pad is space
}
if ( $options == STR_PAD_RIGHT )
{
my $padding = substr( $pad x $diff, 0, $diff );
$rv = $input . $padding;
}
elsif ( $options == STR_PAD_LEFT )
{
my $padding = substr( $pad x $diff, 0, $diff );
$rv = $padding . $input;
}
elsif ($options == STR_PAD_BOTH )
{
$rv = substr( $pad x $length, 0, $length );
substr( $rv, $diff / 2, length $input ) = $input;
}
else
{
print "Invalid 4th argument to str_pad";
}
return $rv;
}
sub trim
{
my $a = $_[0];
$a=~s/^\s+//g;
$a=~s/\s+$//g;
$a='' if (!defined($_[0]));
return $a;
}
Thanks,
Badri.
-----Original Message-----
From: Hill, Ronald [mailto:[EMAIL PROTECTED]
Sent: Tuesday, October 18, 2005 2:51 PM
To: Soundararajan, Badrinarayanan
Cc: [email protected]
Subject: RE: months between 2 dates
Hello Badri,
Soundararajan, Badrinarayanan wrote:
> Hi,
>
(snipped)
>
> Initially i used DateManip's DateCalc method, but that is hogging too
> much memory.
Perhaps you could provide the code you have.
> So i am trying to move to DateCalc.
>
> Could you give me the basic logic and conditions to check for months
> between 2 dates
>
The RECIPES section of that module has something you could use?
How do I check whether a given date lies within a certain range of
dates?
use Date::Calc qw( Date_to_Days );
$lower = Date_to_Days($year1,$month1,$day1);
$upper = Date_to_Days($year2,$month2,$day2);
$date = Date_to_Days($year,$month,$day);
if (($date >= $lower) && ($date <= $upper))
{
# ok
}
else
{
# not ok
}
I hope this helps.
Ron
"Secure Server" made the following
annotations on 10/18/2005 02:53:32 PM
------------------------------"This e-mail, including attachments, may include
confidential and/or proprietary information, and may be used only by the person
or entity to which it is addressed. If the reader of this e-mail is not the
intended recipient or his or her authorized agent, the reader is hereby
notified that any dissemination, distribution or copying of this e-mail is
prohibited. If you have received this e-mail in error, please notify the sender
by replying to this message and delete this e-mail immediately."
==============================