質問

これまでのところ、私は以下を持っています:

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"

ただし、これによりエラーが発生します。

ORA-00904: "current_month":無効な識別子

ただし、Where句がなければ、正常に機能します。何か案は?

役に立ちましたか?

解決

残念ながら、まだ利用できないため、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

またはこれを行います:

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"

他のヒント

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"
    
  • または、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
    

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はすべての行に対して呼び出される必要はありません。

日付を比較したい場合は、それらを文字列に変換しないでください - Oracleは日付/時刻算術のサポートを組み込みました。

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

日付算術を使用する最良の方法の1つは、前月に日付があるかどうかを判断することです。今月の初日を返すTrunc(日付、「月」)の組み合わせを使用することです。 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秒を差し引くため、日付範囲は効果的になります(2010年11月になったと仮定します)

代替の同等の構文は次のとおりです。

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');
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top