Oracle SQL Vorheriger Monat Abfrage Problem
Frage
Bisher habe ich bekam die folgende:
SELECT TO_CHAR("HOL_DEPART_DATES"."DEPART_DATE", 'MM') as "Depart_Month",
TO_CHAR(sysdate, 'mm')-1 as "Current_Month"
FROM "HOL_DEPART_DATES" "HOL_DEPART_DATES"
WHERE "Depart_Month" = "Current_Month"
Allerdings gibt dies mir eine Fehlermeldung:
ORA-00904: "current_month": ungültige Kennung
Allerdings ohne die WHERE-Klausel, es funktioniert gut. Irgendwelche Ideen?
Lösung
Leider kann man nicht die Spaltenaliasnamen in der WHERE-Klausel verweisen, da sie noch nicht verfügbar sind. Sie können dies entweder tun:
select TO_CHAR("HOL_DEPART_DATES"."DEPART_DATE", 'MM') as "Depart_Month",
TO_CHAR(sysdate, 'mm')-1 as "Current_Month"
from "HOL_DEPART_DATES" "HOL_DEPART_DATES"
where TO_CHAR("HOL_DEPART_DATES"."DEPART_DATE", 'MM') = TO_CHAR(sysdate, 'mm')-1
oder dies tun:
select "Depart_Month", "Current_Month"
from
( select TO_CHAR("HOL_DEPART_DATES"."DEPART_DATE", 'MM') as "Depart_Month",
TO_CHAR(sysdate, 'mm')-1 as "Current_Month"
from "HOL_DEPART_DATES" "HOL_DEPART_DATES"
)
where "Depart_Month" = "Current_Month"
Andere Tipps
Die SELECT-Klausel wird nach der WHERE-Klausel in SQL ausgewertet. Aus diesem Grund ist die WHERE-Klausel kann nicht die Aliase sehen Sie definiert haben.
Entweder:
-
führt eine Unterabfrage:
SELECT "Depart_Month", "Current_Month" FROM (SELECT TO_CHAR("HOL_DEPART_DATES"."DEPART_DATE", 'MM') AS "Depart_Month", TO_CHAR(SYSDATE, 'mm') - 1 AS "Current_Month" FROM "HOL_DEPART_DATES" "HOL_DEPART_DATES") WHERE "Depart_Month" = "Current_Month"
-
oder verwenden Sie den Ausdruck in der where-Klausel:
SELECT TO_CHAR("HOL_DEPART_DATES"."DEPART_DATE", 'MM') AS "Depart_Month", TO_CHAR(SYSDATE, 'mm') - 1 AS "Current_Month" FROM "HOL_DEPART_DATES" "HOL_DEPART_DATES" WHERE TO_CHAR("HOL_DEPART_DATES"."DEPART_DATE", 'MM') = TO_CHAR(SYSDATE, 'mm') - 1
würde ich auf jeden von der Durchführung arithmtic auf dem Rückgabewert von TO_CHAR entfernt. Wenn Subtrahieren von 1 von der Zeichenfolge '01' (januari) werden wir nicht mit 12 (Dezember) enden.
Sie sollten etwas tun:
select *
from hol_depart_dates
where depart_date between trunc(add_months(sysdate, -1), 'MM')
and trunc(sysdate, 'MM') - interval '1' second;
Nun kann die Abfrage einen Index für depart_date verwenden. Und TO_CHAR muss nicht für jede Zeile aufgerufen werden.
Wenn Sie Daten vergleichen möchten, sollten Sie wandeln sie nicht in Strings -. Oracle hat integrierte Unterstützung für Datum / Zeit-Arithmetik
In Ihrem Fall scheint es, Sie die Abfrage der Tabelle, wo der Monat der Abreise auf den Monat gleich zurück - was nicht sinnvoll ist. Wenn es November ist zur Zeit, dann würde die Abfrage zurückgeben Zeilen ab Oktober 2010, im Oktober 2009, Oktober 2008, usw. Sind Sie sicher, dass das, was Sie wollten?
Eine der besten Möglichkeiten, Datumsberechnungen zu verwenden, um festzustellen, ob ein Datum innerhalb des letzten Monats ist eine Kombination aus TRUNC (Datum, ‚Monat‘) zu verwenden, die den ersten Tag des aktuellen Monats zurückgibt, mit ADD_MONTHS ( Datum, -1), die das Datum vor 1 Monat bekommt.
SELECT TO_CHAR("HOL_DEPART_DATES"."DEPART_DATE", 'MM') as "Depart_Month",
TO_CHAR(ADD_MONTHS(sysdate, -1), 'mm') as "Current_Month"
FROM "HOL_DEPART_DATES"
WHERE "HOL_DEPART_DATES"."DEPART_DATE"
BETWEEN ADD_MONTHS(TRUNC(SYSDATE,'MONTH'),-1)
AND TRUNC(SYSDATE,'MONTH') - 0.00001;
Die "0.00001" subtrahiert 1 Sekunde ab dem Zeitpunkt, so dass der Datumsbereich wird wirksam (es unter der Annahme ist jetzt November 2010) 01-Oct-2010 00:00:00 bis 31-Oct-2010 23.59.59.
Eine alternative, gleichwertige Syntax wäre:
SELECT TO_CHAR("HOL_DEPART_DATES"."DEPART_DATE", 'MM') as "Depart_Month",
TO_CHAR(ADD_MONTHS(sysdate, -1), 'mm') as "Current_Month"
FROM "HOL_DEPART_DATES"
WHERE "HOL_DEPART_DATES"."DEPART_DATE"
>= ADD_MONTHS(TRUNC(SYSDATE,'MONTH'),-1)
AND "HOL_DEPART_DATES"."DEPART_DATE" < TRUNC(SYSDATE,'MONTH');