A única coisa que consigo pensar é que, de alguma forma, as expressões que definem o intervalo de datas estão retornando uma seção de tempo (aquelas
strtotime()
parecem os culpados). Esta resposta
lida com duas opções (a opção 2 é a boa) quando a data inclui uma parte do tempo. No seu caso específico, acho que essa seria a melhor abordagem para resolver o 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 o
date()
função "remove" a seção de tempo do valor. Mais uma coisa:seu código pode estar vulnerável a ataques de injeção de SQL . Por favor, dê uma olhada aqui para um exemplo (humorístico) sobre o que é e dicas sobre como lidar com isso.