TRUNC will often lead to (silent) conversions, eg
SQL> create table t ( c timestamp with time zone );
Table created.
SQL> insert into t values ( systimestamp );
1 row created.
SQL> commit;
Commit complete.
SQL> select dump(c) from t;
DUMP(C)
--------------------------------------------------------
Typ=181 Len=13: 120,118,6,13,2,44,53,59,78,126,192,28,60
1 row selected.
SQL> select dump(trunc(c)) from t;
DUMP(TRUNC(C))
--------------------------------------------------------
Typ=13 Len=8: 226,7,6,13,0,0,0,0
1 row selected.
which is why you're seeing "internal_function".
In all cases, I don't like using TRUNC at all. For me, I would phrase the queries as:
where date_col >= trunc(sysdate-1)
and date_col < trunc(sysdate)
and for timestamps
where ts_col >= cast(trunc(sysdate-1) as timestamp)
and ts_col < cast(trunc(sysdate) as timestamp)