Tkil tkil-sdpm at
Wed Apr 23 20:43:42 CDT 2003


>>>>> "Bill" == Bill Wood <wwood at> writes:

Bill> Can someone help me out. I've got a problem where perl seems to
Bill> be evaluating the test at line 6 below in a string context.

Um.  ">" always does numeric comparisons, which makes me think that I
don't understand exactly what you're doing here.  Do you mean that
you're getting "foo is not numeric in numeric gt" type warnings?

And is this all under "use strict" and -w?

Bill> I'm taking the results of database call to a datediff function
Bill> and doing a greater than test. When the result is negative the
Bill> if branch is still being taken.

Interestingly enough, there is no documented "sql" method in the
generic DBI perldoc; what DBD are you using?

Bill> 1	my $date_diff=0;
Bill> 2	my $diff_test = 0;
Bill> 3	my $sql = qq/
Bill> 4	select datediff(dd,"$last_used_date{$card_key}","$trans_date")/;
Bill> 5	@ret = $dbh->sql("$sql",sub {($date_diff)=@_;});
Bill> 6	if	($date_diff > $diff_test ) {
Bill> 7		$last_used_date{$card_key} = $trans_date;
Bill> 8		}

I'd probably phrase this like so:

| my $res_aref = $dbh->selectall_arrayref( "SELECT datediff( dd, ?, ? )",
|                                          {}, # no attributes
|                                          $last_used_date{$card_key},
|                                          $trans_date );
| my $date_diff = $res_aref->[0][0];
| my $diff_test = 0;
| if ( $date_diff > $diff_test )
| {
|     $last_used_date{$card_key} = $trans_date;
| }

I'm used to Oracle SQL, which would require that we select from the
pseudo-table DUAL to get the results of a function like that:

| my $res_aref = $dbh->selectall_arrayref( "SELECT datediff( dd, ?, ? )" .
|                                          "  FROM DUAL",
|                                          {}, # no attributes
|                                          $last_used_date{$card_key},
|                                          $trans_date );

Which is getting a little out of hand; switching to defining $sql
seperately doesn't seem like a bad idea at this point:

| my $sql = 'SELECT datediff( dd, ?, ? ) FROM DUAL';
| my $res_aref = $dbh->selectall_arrayref( $sql, {}, # no attributes
|                                          $last_used_date{$card_key},
|                                          $trans_date );

If you are going to be doing a lot of these SELECT calls, you should
perhaps perpare it only once, then do the explicit execute / fetch /
finish loop.

Bill> This is perl, version 5.005_03 built for sun4-solaris

Note that this is a relatively ancient version of perl; 5.8.0 is
current (or has 5.8.1 come out?).  Bug your admins to upgrade.

Bill> All comments appreciated, thanks

Just by the by, if you are just trying to compare two date strings,
consider using Date::Parse and Date::Calc instead of making a much
much much more expensive call into the database.

Share and enjoy,

The posting address is: san-diego-pm-list at

List requests should be sent to: majordomo at

If you ever want to remove yourself from this mailing list,
you can send mail to <majordomo at> with the following
command in the body of your email message:

    unsubscribe san-diego-pm-list

If you ever need to get in contact with the owner of the list,
(if you have trouble unsubscribing, or have questions about the
list itself) send email to <owner-san-diego-pm-list at> .
This is the general rule for most mailing lists when you need
to contact a human.

More information about the San-Diego-pm mailing list