2016-04-13 3 views
0
select count(*) as a 
    from event 
    where eventName='ARTICLE' 
    and to_char(event_date,'DD-MM-YYYY')= '08-04-2016'; 

Ich möchte Datum mit einem bestimmten Datumsformat vergleichen, aber wenn ich diese Abfrage ausführen dauert es viel Zeit. Gibt es einen Weg, wie ich das gleiche Ergebnis mit minimaler Zeit erreichen kann?Wie kann ich das Datum in Oracle SQL vergleichen, ohne to_date/to_char Funktion zu verwenden?

+2

Warum machst du ein 'to_char' auf' event_date' was ich vermute, ist ein 'date' anstatt ein' to_date' in der Zeichenkette zu machen? Versuchen Sie, die Zeitkomponente von 'event_date' auf Mitternacht zu setzen? Welche Index (e) sind verfügbar? Ist 'event_date' indiziert? Welche Indizes sind in der Tabelle definiert? –

+0

Ich denke du willst den ganzen Tag. Versuchen Sie: 'Wählen Sie Anzahl (*) als von Ereignis wobei eventName = 'ARTICLE' und event_date zwischen to_date ('08 -04-2016 ',' tt-mm-yyyy ') und to_date ('09 -04- 2016 ',' dd-mm-yyyy ') ' – dcieslak

+0

Bitte geben Sie Ihre Tabellenstruktur (einschließlich der Indizes) und den EXPLAIN-Plan Ihrer Anfrage an – Aleksej

Antwort

1

Haben Sie einen Index für EVENT_DATE? Wenn Sie dies nicht tun, haben Sie einen vollständigen Tabellenscan und das ist so schnell wie es geht, ohne einen Index zu erstellen.

Wenn Sie einen Index haben, wird Ihre Abfrage ihn nicht verwenden, weil der to_char() ihn deaktiviert. Lassen Sie uns annehmen, dass Ihre Tabelle genügend unterschiedliche Daten enthält und dass sie ausreichend verklumpt sind, um einen Index sinnvoll zu nutzen. Sie können die Abfrage so ändern, dass ein Index auf verschiedene Arten verwendet wird.

Wenn EVENT_DATE enthält nur das Datum Element dieses verwenden

where event_date = date '2016-04-08' 

Wenn EVENT_DATE ein Zeitelement dieses

where event_date >= date '2016-04-08' 
and event_date < date '2016-04-09' 

Beachten Sie, dass Oracle speichert DATE Werte in besonderer Weise verwenden enthält. Sie werden nicht mit einer bestimmten Maske gespeichert. Formatierung ist nur eine Display-Sache. Alles, was wir tun müssen, ist das Zieldatum in einem sinnvollen Format zu übergeben.

Verwandte Themen