2016-03-28 5 views
0

I Rekord auf TransDate und ValueDate Basis zu holen habenDatenbankabfrage: [Union]/[oder Bedingung in where-Klausel]

Datensatz Fetch basiert auf folgenden Kriterien:

  1. TransDate ist am oder vor dem 20. März 2016 und ValueDate ist am 20. März 2016
  2. ValueDate am oder vor dem 20. März 2016 und ist TransDate ist am 20. März 2016

Mein Kollege versucht UNION zu verwenden w ith folgende Abfrage

select * from Sales where ValueDate < '2016-03-21' and ValueDate >= '2016-03-20' 
    and TransDate < '2016-03-21' 
Union 
    select * from Sales where TransDate < '2016-03-21' and TransDate >= '2016-03-20' 
    and ValueDate < '2016-03-21' 

Aber ich fühlte, dass die Abfrage neu schreiben, um folgende Art und Weise

select * from Sales where ((ValueDate < '2016-03-21' and ValueDate >= '2016-03-20' 
    and TransDate < '2016-03-21') or (TransDate < '2016-03-21' 
    and TransDate >= '2016-03-20' and ValueDate < '2016-03-21')) 

Hinweis: Sowohl TransDate und ValueDate ist Zeitstempel-Datentyp.

Bitte schlagen Sie den Unterschied der beiden Abfrage, sonst, wenn eine andere Herangehensweise am besten suggeriert mich.

+2

beide Abfrage gleichen Ergebnisse liefern, aber Unterschied in der Leistung sein kann und kann nicht sagen, was ... besser abschneiden wird es Abfrageausführungsplan und wie viele Daten hängen Ihre Tabellen und wie viele Daten nach Ihren Bedingungen filtern ... also überprüfen Sie Ihre eigenen und verwenden Sie, was besser ist .... Ihre Abfrage ist leistungsmäßig besser als von @Dylan vorgeschlagen, da die vorgeschlagene Abfrage den Index aufgrund der Datumsfunktion nicht effizient verwenden wird . –

+0

@ZafarMalik: Tabelle enthalten Millionen von Datensatz, wird es rund 5k bis 10k Datensätze filtern. –

+0

transdate und valuedate Felder sind indiziert? .... und viel Zeit Ihre beide Abfragen nehmen ... –

Antwort

0

Es gibt keinen Unterschied in den Ergebnissen zwischen den beiden Abfragen. Aber die Zeit kostet Zeit vielleicht anders.

Ich denke, die 2. wird schneller sein.

Hier ist eine weitere Option:

select * from Sales 
where 
    (DATE(ValueDate) = '2016-03-20' and TransDate < '2016-03-21') or 
    (DATE(TransDate) = '2016-03-20' and ValueDate < '2016-03-21')