Jedyne, o czym mogę pomyśleć, to to, że wyrażenia definiujące przedział dat zwracają sekcję czasu (te strtotime()
wyglądają jak winowajcy). Ta odpowiedź
dotyczy dwóch opcji (opcja 2 jest dobra), gdy data zawiera część czasu.
Myślę, że w Twoim konkretnym przypadku byłoby to najlepsze podejście do rozwiązania problemu:
SELECT loanac.id, loanac.name, loanac.lacc, loanac.phone
, SUM(loantrans.in) as totalin, SUM(loantrans.out) as totalout
FROM loanac
INNER JOIN loantrans on loanac.lacc = loantrans.account
-- Instead of an implicit join in the WHERE clause, use an explicit INNER JOIN
WHERE date(loantrans.date) < date('$range')
AND date(loantrans.date) > date('$date')
GROUP BY loanac.lacc
HAVING SUM(IFNULL(`loantrans`.`out`,0)) > SUM(IFNULL(`loantrans`.`in`,0))
Zauważ, że date()
funkcja "usuwa" sekcję czasową wartości.
Jeszcze jedno:Twój kod może być podatny na ataki wstrzykujące SQL . Proszę spójrz tutaj za (humorystyczny) przykład tego, co to jest, i wskazówki, jak sobie z tym poradzić.