You can, pretty much like Michael and Gordon, just insert an empty string using union all , but you need to have it before order by :
... and to_date(to_char(t.enddatetime, 'DD-MON-YYYY')) <= to_date('?DATE2::?','MM/DD/YYYY') union all select null, null, null, null, null, null, null, null from dual order by eventid, starttime, actionsequence;
... and you cannot use the case that Gordon had directly in order by , because this is not a selected value - you will get ORA-07185. (Note that the column names in order by are the aliases that you assigned to select , not the ones indicated in the table, and you do not include the table name / alias, and you do not need to use the null alias in the combined part, but you can do this for clarity).
But it depends on the fact that null sorted after any real values, which may not always be (not sure, but may be affected by the NLS parameters), and it is not known whether the real eventkey will never be null . Therefore, it is probably safer to enter a dummy column in both parts of the query and use it for ordering, but exclude it from the results by nesting the query:
select crewactionfactid, crewkey, eventid, actionsequence, type, starttime, endtime, duration from ( select 0 as dummy_order_field, t.crewactionfactid, t.crewkey, t.eventkey as eventid, t.actionsequence, case t.actiontype when 'DISPATCHED' then '2-Dispatched' when 'ASSIGNED' then '1-Assigned' when 'ENROUTE' then '3-Enroute' when 'ARRIVED' then '4-Arrived' else 'unknown' end as type, t.startdatetime as starttime, t.enddatetime as endtime, t.duration from schema_name.table_name t where to_date(to_char(t.startdatetime, 'DD-MON-YYYY')) >= to_date('?DATE1::?','MM/DD/YYYY') and to_date(to_char(t.enddatetime, 'DD-MON-YYYY')) <= to_date('?DATE2::?','MM/DD/YYYY') union all select 1, null, null, null, null, null, null, null, null from dual ) order by dummy_order_field, eventid, starttime, action sequence;
Date processing is odd, especially to_date(to_char(...)) . It looks like you're just trying to lose some of the time, in which case you can use trunk instead:
where trunc(t.startdatetime) >= to_date('?DATE1::?','MM/DD/YYYY') and trunc(t.enddatetime) <= to_date('?DATE2::?','MM/DD/YYYY')
But applying any function to the date column prevents the use of any index, so it is better to leave it alone and get the variable part in the correct state for comparison:
where t.startdatetime >= to_date('?DATE1::?','MM/DD/YYYY') and t.enddatetime < to_date('?DATE2::?','MM/DD/YYYY') + 1
+ 1 adds a day, so id DATE2 was 07/12/2012 , filter < 2012-07-13 00:00:00 , which matches <= 2012-07-12 23:59:59 .