Q1: вы можете сравнивать даты, используя обычные операторы сравнения, поэтому, чтобы проверить, принадлежит ли данная дата определенному интервалу, вам необходимо:
...my_date >= start_date AND my_date <= end_date
Или:
...my_date BETWEEN start_date AND end_date
Q2 - Это не работает из-за вызова TO_CHAR, который ожидает дату в качестве первого аргумента (не строки) и возвращает строку, которая не подходит для потребления TO_TIMESTAMP.
Вы должны пропустить TO_CHAR и начатьс TO_TIMESTAMP:
select
extract( hour from
to_timestamp('04/04/2018 04:05:05', 'dd/mm/yyyy hh24:mi:ss')
)
) as v_to
from dual;