Sie können, so wie Michael und Gordon es getan haben, einfach eine leere Zeile anhängen mit union all
aber Sie müssen es vor dem 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;
... und Sie können nicht die case
die Gordon direkt in der order by
weil es sich nicht um einen ausgewählten Wert handelt - Sie erhalten eine ORA-07185. (Beachten Sie, dass die Spaltennamen in der Datei order by
sind die Aliasnamen die Sie im Abschnitt select
, nicht die in der Tabelle; und Sie fügen den Tabellennamen/Alias nicht ein; und es ist nicht notwendig, den Alias null
Spalten im Union-Teil, aber der Übersichtlichkeit halber sollten Sie das tun).
Dies setzt jedoch voraus, dass null
nach den realen Werten sortiert werden, was nicht immer der Fall ist (nicht sicher, könnte aber durch NLS-Parameter beeinflusst werden), und es ist nicht bekannt, ob die realen eventkey
jemals sein kann null
sowieso. Daher ist es wahrscheinlich sicherer, in beiden Teilen der Abfrage eine Dummy-Spalte einzuführen und diese für die Bestellung zu verwenden, sie aber durch Verschachtelung der Abfrage aus den Ergebnissen auszuschließen:
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;
Die Handhabung des Datums ist allerdings merkwürdig, insbesondere die to_date(to_char(...))
Teile. Es sieht so aus, als ob Sie nur versuchen, den Zeitanteil zu verlieren, in diesem Fall können Sie verwenden trunk
stattdessen:
where trunc(t.startdatetime) >= to_date('?DATE1::?','MM/DD/YYYY')
and trunc(t.enddatetime) <= to_date('?DATE2::?','MM/DD/YYYY')
Die Anwendung einer Funktion auf die Datumsspalte verhindert jedoch die Verwendung eines Indexes, so dass es besser ist, diesen in Ruhe zu lassen und den variablen Teil in den richtigen Zustand für den Vergleich zu bringen:
where t.startdatetime >= to_date('?DATE1::?','MM/DD/YYYY')
and t.enddatetime < to_date('?DATE2::?','MM/DD/YYYY') + 1
En + 1
fügt einen Tag hinzu, so id DATE2
war 07/12/2012
ist der Filter < 2012-07-13 00:00:00
, was dasselbe ist wie <= 2012-07-12 23:59:59
.