2010-11-26 11 views
1

は、これまでのところ、私は次のことを持っている:OracleのSQL前月のクエリの問題

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" 

しかしこれは私にエラーを与える:WHERE句なししかし

ORA-00904: "Current_Month": invalid identifier

、それが正常に動作します。何か案は?

答えて

2

残念ながら、WHERE句の列エイリアスは、まだ使用できないため参照できません。 SELECT句はSQLのWHERE句の後に評価され

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" 
+0

スポットで、あなたの両方が、今はるかに理にかなっています! – Coffeee

2

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 

または次の操作を行います。あなたはこれを行うことができます。 WHERE句では、定義したエイリアスが表示されません。

次のいずれかの

  • は、サブクエリを実行します。

    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" 
    
  • またはwhere句で式を使用します。

    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 
    
1

私が離れて行ってからご利用いただけます戻り値frの算術TO_CHAR。 文字列 '01'(januari)から1を引くと、12(12月)に終わることはありません。

select * 
    from hol_depart_dates 
where depart_date between trunc(add_months(sysdate, -1), 'MM') 
         and trunc(sysdate, 'MM') - interval '1' second; 

今すぐクエリがdepart_dateにインデックスを使用することができます。

あなたはこのような何かを行う必要があります。 TO_CHARはすべての行に対して呼び出す必要はありません。

+0

TRUNC(SYSDATE、 'MM')から一日を引くので、その日の最後の日(その時刻が真夜中12時でない限り)は事実上欠けてしまいます。 –

+0

Opps、よく点刻されています。今修正されました。 – Ronnis

0

日付を比較する場合は、日付を比較する必要があります。日付と時刻の算術演算をサポートしています。

あなたの場合、出発日の月が前の月と同じであるテーブルを照会しているようです。これは意味がありません。現在11月の場合、クエリは2010年10月、2009年10月、2008年10月などから行を返します。

日付計算が前月の範囲内にあるかどうかを判断する最も良い方法の1つは、現在の月の最初の日を返すTRUNC(日付、 'MONTH')とADD_MONTHS (date、-1)、これは1ヶ月前の日付を取得します。

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; 

は「0.00001」とは、日付から第1減算するので、日付の範囲を効果的に01 10月-2010 00:00:00に31 10月2010年23(それは今や2010年11月であると仮定して)次のようになります。 59:59。

代わり、同等の構文は次のようになります。

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');