If you know :basedate is constant for a given user experience (execution of a task), then your first step should be to calculate the interval between sysdate and :basedate. Execute this once to figure it out and minimize CPU consumption later:
select numtodsinterval(sysdate - :basedate, 'DAY') dsinterval
from dual;
Then you can replace systimestamp
in your insert statement text with this:
systimestamp - :dsinterval
If :basedate changes quite frequently, then you have to put more of the code into the expression, like this:
systimestamp - numtodsinterval(sysdate - :basedate, 'DAY')
Obviously, in the above examples, the datatype for :basedate is date. If it were a string datatype, then you would have to refer to it like this if the date string is formatted according to the current setting of NLS_DATE_FORMAT:
to_date(:basedate)
or this depending upon how the date string were formatted:
to_date(:basedate, 'some date format string')