Lo único que se me ocurre es que, de alguna manera, las expresiones que definen el intervalo de fechas están devolviendo una sección de tiempo (esas strtotime()
parecerse a los culpables). Esta respuesta
trata con dos opciones (la opción 2 es la buena) cuando la fecha incluye una parte de tiempo.
En su caso específico, creo que este sería el mejor enfoque para resolver el problema:
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))
Observe que date()
función "elimina" la sección de tiempo del valor.
Una cosa más:su código puede ser vulnerable a ataques de inyección SQL . Por favor, eche un vistazo aquí para obtener un ejemplo (humorístico) de lo que es y consejos sobre cómo tratarlo.