2010-01-10 13 views
11

eine Oracle 10g db ich mit einem Tisch etwas wie dieses:oracle Datumsbereich

create table x(
ID NUMBER(10) primary key, 
wedding DATE NOT NULL 
); 

wie kann ich

select * from x where wedding is in june 2008??? 

Ich weiß, es ist wahrscheinlich leicht gefallen, aber ich konnte nicht gefunden eine befriedigende Antwort bisher. Hilfe wird sehr geschätzt.

Antwort

19

Verwendung:

SELECT * 
    FROM x 
WHERE x.wedding BETWEEN TO_DATE('2008-JUN-01', 'YYYY-MON-DD') 
          AND TO_DATE('2008-JUL-01', 'YYYY-MON-DD') 

Verwendung von TO_DATE 00:00:00 ein Datum mit einem Zeitabschnitt konstruiert, die das Enddatum erfordert voraus einen Tag zu sein, wenn Sie Logik verwenden möchten, um den Strom zu korrigieren Datum ist eine Sekunde vor Mitternacht. Ungeprüfte:

TO_DATE('2008-JUN-30', 'YYYY-MON-DD') + 1 - (1/(24*60*60)) 

, dass ein Tag bis zum 30-Jun-2008 hinzufügen soll, und dann eine Sekunde, um ein endgültiges Datum der 30-Jun-2008 23:59 zurückzukehren subtrahieren.

Referenzen:

+2

DATE-Typ in ORACLE enthält Datums- und Uhrzeitkomponente. Ausdruck TO_DATE ('2008-JUN-30', 'JJJJ-MON-TT') entspricht '2008-JUN-30 00:00:00'. Wenn Daten Zeitinformationen enthalten, können Probleme mit diesem Ausdruck auftreten. Hochzeit, die am '2008-JUN-30 16:00:00' (4pm) passiert, wird nicht im Ergebnissatz der obigen Frage sein. – zendar

+1

also sollte ich es auf BETWEEN 01 Juni und 01 Juli setzen. – Hoax

+0

Re "Verwendung von TO_DATE ..." - Ich stimme zu, es ist ein bisschen komplizierter, wenn Sie Zeit und Datum zusammen haben. Ihr aktuelles oberes Limit: 'TO_DATE ('2008-JUL-01', 'JJJJ-MON-TT') kann jetzt Hochzeiten vom 2008-JUL-01 bekommen, die keine Zeit haben (ich nehme an, dass es keine Mitternacht gibt) Hochzeiten), so kann diese Abfrage ungenau sein. Sie müssen wahrscheinlich Randfälle ausarbeiten und einen Kommentar zu Zeitanteil und BETWEEN-Operator hinzufügen. – zendar

2

Dies ist ANSI SQL und Oracle ab Version 9i

SELECT * 
FROM x 
WHERE EXTRACT(YEAR FROM wedding) = 2008 
AND EXTRACT(MONTH FROM wedding) = 06 

Klassische Lösung mit Oracle-spezifischen TO_CHAR() unterstützt:

SELECT * 
FROM x 
WHERE TO_CHAR(wedding, 'YYYY-MMM') = '2008-JUN' 

(die letzte Lösung wurde unterstützt, als Dinosaurier noch auf der Erde liefen)

+2

Keiner wird einen Index verwenden (wenn einer existiert) auf der Spalte "Hochzeit". –

+0

Wenn PLW-Fehler aktiviert sind, führen beide Optionen zu einer Konvertierung weg vom Datentypfehler. –

+0

@OMG Ponys - ja, du hast Recht. Die Zwischenlösung ist viel besser für die Leistung. Nicht sicher, was Sie unter PLW-Fehlern verstehen. Hast du einen Zeiger für mich? TIA –