2017-05-04 3 views
1

Ich bin auf eine Abfrage gestoßen, die mich neugierig macht, ob der Programmierer Showboating war oder ob es einen Verdienst gibt, wie es in Bezug auf die Leistung getan wurde. Ich habe keine Ahnung, warum die Ab-Zeit 01:59 anstatt 00:00 ist, das würde tatsächlich einige der Ergebnisse entfernen, die eigentlich aufgenommen werden sollten.Wo Datum zwischen a und b Leistung

Dies ist die where-Klausel der Abfrage

WHERE REPORTDATE BETWEEN TRUNC(SYSDATE - 21) + 01/24 + 59/(24 * 60) + 59/(24 * 60 * 60) 
        AND TRUNC(SYSDATE) + 23/24 + 59/(24 * 60) + 59/(24 * 60 * 60) 

und wenn meine Mathe richtig ist, so ist die gleiche

WHERE REPORTDATE BETWEEN to_date('13/04/2017 01:59','dd/mm/yyyy hh24:mi') 
       AND to_date('04/05/2017 23:59','dd/mm/yyyy hh24:mi') 

Gibt es einen Vorteil in der ersten berechnet, wo Klausel über die zweiten ?

+0

ich kann nicht einen Weg vorstellen, dass die erste Abfrage effizienter sein könnte, aber ich weiß Oracle nicht von innen nach außen. Ist es möglich, die Person zu fragen, die die ursprüngliche Abfrage geschrieben hat? Es gibt viele Entwickler, die in SQL nicht sehr stark sind und die Datumsfunktionen in SQL nicht einmal kennen. – RToyo

+3

Das erste muss nicht neu geschrieben werden, wenn Sie es an einem anderen Tag ausführen. –

+1

Haben Sie versucht, die Erklärungsebene von beiden zu erzeugen, um die Unterschiede tatsächlich zu sehen? –

Antwort

4

Sie Intervall-Literale verwenden können, um loszuwerden, aller Rechen- und vereinfachen Sie die Abfrage:

WHERE REPORTDATE BETWEEN TRUNC(SYSDATE) - INTERVAL '20 22:00:01' DAY TO SECOND 
       AND  TRUNC(SYSDATE) + INTERVAL '00 23:59:59' DAY TO SECOND 

oder

WHERE REPORTDATE BETWEEN TRUNC(SYSDATE) - INTERVAL '21' DAY 
              + INTERVAL '01:59:59' HOUR TO SECOND 
       AND  TRUNC(SYSDATE) + INTERVAL '00 23:59:59' DAY TO SECOND 

oder

WHERE REPORTDATE >= TRUNC(SYSDATE) - INTERVAL '20 22:00:01' DAY TO SECOND 
AND REPORTDATE < TRUNC(SYSDATE) + INTERVAL '1' DAY 
2

Dies ist zu lang für einen Kommentar. Es ist schwer, sich einen Leistungsunterschied vorzustellen, der auf unterschiedlichen Methoden zur Berechnung von Konstanten in einer Abfrage beruht.

würde ich dies mit so etwas schreiben:

WHERE REPORTDATE >= CAST(TIMESTAMP '2017-04-13 02:00:00' as DATE) and 
     REPORTDATE < DATE '2017-05-05' 

Wenn Sie Datum/Zeit-Konstanten werden umfassen, die eingebauten Mechanismen verwenden, die Standardformate unterstützen.

oder für mehr Flexibilität auf der Basis des aktuellen Datums: (... Oder, falls 1.59 wirklich bestimmt dann TRUNC(sysdate) - 21 + (1 * 60 + 59)/(24 * 60).)

WHERE REPORTDATE >= TRUNC(sysdate) - 21 + 2/24 AND 
     REPORTDATE < TRUNC(sysdate) + 1 

+0

@AlexPoole. . . Vielen Dank. Ich sah die '+ 23' und hörte dann auf zu lesen, weil ich die'/24' verpasste. –

Verwandte Themen