Frage

Ich bin mit Oracle-Datenbank. Ich möchte eine Abfrage auszuführen, die Daten zwischen zwei Daten zu überprüfen.

NAME               START_DATE    
-------------    ------------- 
Small Widget       15-JAN-10 04.25.32.000000 PM      
Product 1          17-JAN-10 04.31.32.000000 PM  



select * from <TABLENAME> where start_date  
BETWEEN '15-JAN-10' AND '17-JAN-10'

, aber ich nicht irgendwelche Ergebnisse von oben Abfrage erhalten. Ich glaube, ich habe verwenden „wie“ und „%“. Aber ich weiß nicht, wo sie zu benutzen. Bitte werfen einige Lichter zu diesem Thema.

Vielen Dank im Voraus.

War es hilfreich?

Lösung

von Ihrer Ausgabe zu urteilen sieht es aus wie Sie START_DATE als Zeitpunkt definiert haben. Wenn es dich um ein reguläres Datum Oracle war die Lage wäre, die implizite Konvertierung zu handhaben. Aber da dies nicht der Fall müssen Sie diese Zeichenfolge explizit warfen Daten sein.

SQL> alter session set nls_date_format = 'dd-mon-yyyy hh24:mi:ss'
  2  /

Session altered.

SQL>
SQL> select * from t23
  2  where start_date between '15-JAN-10' and '17-JAN-10'
  3  /

no rows selected

SQL> select * from t23
  2  where start_date between to_date('15-JAN-10') and to_date('17-JAN-10')
  3  /

WIDGET                          START_DATE
------------------------------  ----------------------
Small Widget                    15-JAN-10 04.25.32.000    

SQL> 

Aber wir noch bekommen nur eine Zeile. Dies liegt daran, START_DATE ein Zeitelement. Wenn wir nicht angeben, die Zeitkomponente Oracle defaults es bis Mitternacht. Das ist gut für die von Seite der BETWEEN aber nicht für die bis Seite:

SQL> select * from t23
  2  where start_date between to_date('15-JAN-10') 
  3                       and to_date('17-JAN-10 23:59:59')
  4  /

WIDGET                          START_DATE
------------------------------  ----------------------
Small Widget                    15-JAN-10 04.25.32.000
Product 1                       17-JAN-10 04.31.32.000

SQL>

Bearbeiten

Wenn Sie nicht in der Zeitkomponente passieren können, gibt es ein paar Möglichkeiten. Eine davon ist die sich ändern WHERE-Klausel des Zeitelement von den Kriterien zu entfernen:

where trunc(start_date) between to_date('15-JAN-10') 
                            and to_date('17-JAN-10')

Dies könnte Auswirkungen auf die Leistung haben, weil es für alle B-Baum-Index auf START_DATE disqualifiziert. Sie müssten stattdessen eine funktionsbasierte Index erstellen.

Alternativ können Sie das Zeitelement zu dem Zeitpunkt in Ihrem Code hinzu:

where start_date between to_date('15-JAN-10') 
                     and to_date('17-JAN-10') + (86399/86400) 

Aufgrund dieser Probleme viele Menschen bevorzugen die Verwendung von between durch Überprüfung für Datumsgrenzen wie dies zu vermeiden:

where start_date >= to_date('15-JAN-10') 
and start_date < to_date('18-JAN-10')

Andere Tipps

Sie müssen diejenigen tatsächlichen Daten anstelle von Strings konvertieren, versuchen Sie dies:

SELECT *
FROM <TABLENAME>
WHERE start_date BETWEEN TO_DATE('2010-01-15','YYYY-MM-DD') AND TO_DATE('2010-01-17', 'YYYY-MM-DD');

Edited mit Format behandeln wie angegeben:

SELECT *
FROM <TABLENAME>
WHERE start_date BETWEEN TO_DATE('15-JAN-10','DD-MON-YY') AND TO_DATE('17-JAN-10','DD-MON-YY');

Wie APC zu Recht darauf hingewiesen, Ihre start_date Spalte erscheint ein TIMESTAMP zu sein, aber es könnte eine TIMESTAMP WITH lokale Zeitzone oder einen Zeitstempel MIT ZEITZONE Datentyp sein. Diese könnten auch alle Fragen beeinflussen Sie wurden auf die Daten zu tun, wenn Sie Ihre Datenbank-Server in einer anderen Zeitzone zu sich selbst war. Doch lassen Sie uns diese einfach zu halten und annehmen, dass Sie in der gleichen Zeitzone wie der Server sind. Erstens gibt es das Vertrauen zu geben, überprüfen Sie, dass die start_date ein TIMESTAMP-Datentyp ist.

Mit den SQLPlus DESCRIBE-Befehl (oder das Äquivalent in Ihrer IDE), um sicherzustellen, diese Spalte ist ein Zeitstempel-Datentyp.

zB

DESCRIBE Mytable

Should Bericht:

Name        Null? Type
----------- ----- ------------
NAME              VARHAR2(20) 
START_DATE        TIMESTAMP

Wenn es als eine Art gemeldet = TIMESTAMP dann können Sie Ihre Datumsbereiche mit einfachsten TO_TIMESTAMP Datum Konvertierung abfragen, eine, die kein Argument erfordert (oder Bild).

Wir verwenden TO_TIMESTAMP, um sicherzustellen, dass jeder Index auf der START_DATE Spalte vom Optimierer berücksichtigt wird. APC Antwort auch darauf hingewiesen, dass eine Funktion basierender Index auf dieser Spalte erstellt worden sein könnte und dass das SQL-Prädikat beeinflussen würde, aber wir können in dieser Abfrage nicht kommentieren, dass. Wenn Sie wissen möchten, wie Sie herausfinden, was Indizes haben Tabelle angewendet worden ist, schreiben eine andere Frage, und wir können das separat beantworten.

Also, es unter der Annahme, dass ein Index für start_date, die ein Datentyp timestamp ist und Sie wollen die Optimierer es zu prüfen, Ihre SQL-wäre:

select * from mytable where start_date between to_timestamp('15-JAN-10') AND to_timestamp('17-JAN-10')+.9999999

+. 999999999 ist ganz in der Nähe, aber nicht ganz 1, so dass die Umwandlung von 17-JAN-10 so nah an diesem Tag wie möglich zu Mitternacht sein wird, Sie daher Abfrage gibt beiden Reihen.

Die Datenbank wird sehen, die zwischen AS von 15-JAN-10 00: 00: 00: 0000000 17-JAN-10 23: 59: 59: 99999 und umfassen daher alle Termine aus dem 15., 16. und 17. Januar 2010 unabhängig von der Zeitkomponente des Zeitstempel.

Ich hoffe, das hilft.

Dazzer

Datum Zwischen Abfrage

SELECT *
    FROM emp
    WHERE HIREDATE between to_date (to_char(sysdate, 'yyyy') ||'/09/01', 'yyyy/mm/dd')
    AND to_date (to_char(sysdate, 'yyyy') + 1|| '/08/31', 'yyyy/mm/dd');

Nach Abfrage kann auch verwendet werden:

select * 
  from t23
 where trunc(start_date) between trunc(to_date('01/15/2010','mm/dd/yyyy')) and trunc(to_date('01/17/2010','mm/dd/yyyy'))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top