I needed to whip up a date delta (in my case, today minus 13 months) for SQL. I couldn't push the calculation onto the database, because the field in question is of type text rather than date, and converting it to a date and then subtracting the delta proved to be too expensive. Creating the date in Perl and using that is far more efficient. Don't blame me, I didn't design the schema, I just use it.
It's perhaps too-clever-by-half in that it's the most-commented bit of code I've written in some time, but I like the way it plays with list context.
use Date::Calc 'Add_Delta_YM';
my $date_limit = sprintf( '%02d-%02d-%04d',
reverse # Y M D --> D M Y
Add_Delta_YM(
sub {
$_[5] + 1900, # year
$_[4] + 1, # month
$_[3], # and day
0, # less this many years
-13, # and this many months
}->(localtime), # from today
)
);
use DateTime;
my $date = DateTime->now->subtract(
DateTime::Duration->new( months => 13 )
);
my $date_limit = $date->dmy;
You can then format the result as needed with DATE_FORMAT(). I'm willing to bet both processes will be more efficient done through database than Perl.
perlmonks.org content © perlmonks.org and dave0, explorer, grinder, TedPride
prlmnks.org © 2006 edmund von der burg (eccles & toad)
v 0.03