La seule chose à laquelle je peux penser est que, d'une manière ou d'une autre, les expressions qui définissent l'intervalle de dates renvoient une section de temps (ceux strtotime()
ressemblent aux coupables). Cette réponse
traite de deux options (l'option 2 est la bonne) lorsque la date comprend une partie horaire.
Dans votre cas spécifique, je pense que ce serait la meilleure approche pour résoudre le problème :
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))
Notez que le date()
la fonction "supprime" la section horaire de la valeur.
Une dernière chose :votre code peut être vulnérable aux attaques par injection SQL . Veuillez jeter un œil ici pour un exemple (humoristique) sur ce que c'est, et des conseils sur la façon de le gérer.