Need to capture dates between start date and end date Using perl.

Hi All,

Want to get all dates and Julian week number for that date between the start date and end date. How can I achive this using perl?
(To achive above functionality, I was connecting to the database from DB server. Need to execute the same script in application server, since databse connection does not exist, want to achive this using perl).

Could you please help me on the same?

 
E.g: SciptName 01-MAR-2011 31-MAY-2011

Expected output:

20110301|09
20110302|09
20110303|09
20110304|09
20110305|09
20110306|10
20110307|10
20110308|10
20110309|10
20110310|10
20110311|10
20110312|10
20110313|11
20110314|11
20110315|11
20110316|11
20110317|11
20110318|11
20110319|11
20110320|12
20110321|12
20110322|12
20110323|12
:
:
20110531|22
#!/usr/bin/perl -w

use strict;

use DateTime;
use DateTime::Format::Strptime;

my $format = new DateTime::Format::Strptime ( pattern => '%d-%b-%Y', time_zone => 'EST', );
my $start = $format->parse_datetime($ARGV[0])->epoch();
my $finish = $format->parse_datetime($ARGV[1])->epoch();

while ($start <= $finish) {
    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$julian,$isdst) = localtime($start);
    printf "%4d%02d%02d|%02d\n",  $year + 1900, $mon + 1,  $mday, int($julian/7) + 1;
    $start += 24*60*60;
}
$ ./test.pl 01-MAR-2011 10-MAR-2011
20110301|09
20110302|09
20110303|09
20110304|09
20110305|10
20110306|10
20110307|10
20110308|10
20110309|10
20110310|10
1 Like

Thanks murphy for your response..!!

I copied and pasted this code and named the scipt as archive_perl.pl and executed the script. Got some error. Can you please tell me what is wrong here?

[user@dbname bin 04:31:05 AM]$archive_perl.pl 01-MAR-2011 10-MAR-2011
Can't locate DateTime.pm in @INC (@INC contains: /usr/lib64/perl5/5.8.5/x86_64-linux-thread-multi /usr/lib/perl5/5.8.5 
/usr/lib64/perl5/site_perl/5.8.5/x86_64-linux-thread-multi /usr/lib64/perl5/site_perl/5.8.4/x86_64-linux-thread-multi 
/usr/lib64/perl5/site_perl/5.8.3/x86_64-linux-thread-multi /usr/lib64/perl5/site_perl/5.8.2/x86_64-linux-thread-multi 
/usr/lib64/perl5/site_perl/5.8.1/x86_64-linux-thread-multi /usr/lib64/perl5/site_perl/5.8.0/x86_64-linux-thread-multi 
/usr/lib/perl5/site_perl/5.8.5 /usr/lib/perl5/site_perl/5.8.4 /usr/lib/perl5/site_perl/5.8.3 
/usr/lib/perl5/site_perl/5.8.2 /usr/lib/perl5/site_perl/5.8.1 /usr/lib/perl5/site_perl/5.8.0 /usr/lib/perl5/site_perl 
/usr/lib64/perl5/vendor_perl/5.8.5/x86_64-linux-thread-multi /usr/lib64/perl5/vendor_perl/5.8.4/x86_64-linux-thread-multi 
/usr/lib64/perl5/vendor_perl/5.8.3/x86_64-linux-thread-multi /usr/lib64/perl5/vendor_perl/5.8.2/x86_64-linux-thread-multi 
/usr/lib64/perl5/vendor_perl/5.8.1/x86_64-linux-thread-multi /usr/lib64/perl5/vendor_perl/5.8.0/x86_64-linux-thread-multi 
/usr/lib/perl5/vendor_perl/5.8.5 /usr/lib/perl5/vendor_perl/5.8.4 /usr/lib/perl5/vendor_perl/5.8.3 
/usr/lib/perl5/vendor_perl/5.8.2 /usr/lib/perl5/vendor_perl/5.8.1 /usr/lib/perl5/vendor_perl/5.8.0 
/usr/lib/perl5/vendor_perl .) at /var/factiva/ODS/bin/archive_perl.pl line 5.
BEGIN failed--compilation aborted at /var/factiva/ODS/bin/archive_perl.pl line 5.

---------- Post updated at 05:35 AM ---------- Previous update was at 04:31 AM ----------

---------- Post updated at 05:45 AM ---------- Previous update was at 05:35 AM ----------

Since perl modules DateTime and DateTime::Format::Strptime are not present in my system hence this error. Will install the same and check this script.

Thanks
Nagaraja.

Hi Murphy.

Small flaw I found while executing this script. If I give dates of a month then it is working fine but if I execute this script for the period of 2 months then getting wrong output. Please see the below code. I am getting year as 2111.

As I am beginner in Perl, I request you to resolve this.

./archive_perl 01-MAR-2011 01-MAY-2011

Output:

 
21110301|09
21110302|09
21110303|09
21110304|09
21110305|10
21110306|10
21110307|10
21110308|10
21110309|10
21110310|10
21110311|10
21110312|11
21110313|11
21110314|11
21110315|11
21110316|11
21110317|11
21110318|11
21110319|12
21110320|12
21110321|12
21110322|12
21110323|12
21110324|12
21110325|12
21110326|13
21110327|13
21110328|13
21110329|13
21110330|13
21110331|13
21110401|13
21110402|14
21110403|14
21110404|14
21110405|14
21110406|14
21110407|14
21110408|14
21110409|15
21110410|15
21110411|15
21110412|15
21110413|15
21110414|15
21110415|15
21110416|16
21110417|16
21110418|16
21110419|16
21110420|16
21110421|16
21110422|16
21110423|17
21110424|17
21110425|17
21110426|17
21110427|17
21110428|17
21110429|17
21110430|18
21110501|18
 

You can try like this as well

#!/usr/binperl

use Time::Local;

$start_date=shift;
$end_date=shift;

chomp($start_date,$end_date);

@dt1=split(/-/,$start_date);
@dt2=split(/-/,$end_date);

%months=("JAN"=>"01",
        "FEB"=>"02",
        "MAR"=>"03",
        "APR"=>"04",
        "MAY"=>"05",
        "JUN"=>"06",
        "JUL"=>"07",
        "AUG"=>"08",
        "SEP"=>"09",
        "OCT"=>"10",
        "NOV"=>"11",
        "DEC"=>"12");

$start=timelocal(0,0,0,int($dt1[0]),int($months{$dt1[1]})-1,int($dt1[2])-1900);
$finish=timelocal(0,0,0,int($dt2[0]),int($months{$dt2[1]})-1,int($dt2[2])-1900);

while ($start <= $finish) {
    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$julian,$isdst) = localtime($start);
    printf "%4d%02d%02d|%02d\n",  $year + 2000, $mon + 1,  $mday, int($julian/7) + 1;
    $start += 24*60*60;
}
1 Like

Change 2000 to 1900 in the code example.

Pravin27, your example suffers from this error also.

1 Like

Praveen, Thanks for your response.

Changed 2000 to 1900 and code works fine.

Thanks Murphy..!!