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?

War es hilfreich?

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');
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top