1

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

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句がないと、正常に機能します。何か案は?

4

4 に答える 4

2

残念ながら、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"
于 2010-11-26T16:50:12.300 に答える
2

SELECT句は、SQLのWHERE句の後に評価されます。これが、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
    
于 2010-11-26T16:51:45.870 に答える
1

TO_CHARからの戻り値に対してarithmticを実行することは避けます。文字列「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を呼び出す必要はありません。

于 2010-11-26T19:46:03.003 に答える
0

日付を比較する場合は、文字列に変換しないでください。Oracleには、日付/時刻演算のサポートが組み込まれています。

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

日付演算を使用して日付が前月内にあるかどうかを判断する最良の方法の1つは、現在の月の最初の日を返すTRUNC(date、'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秒を引くため、日付範囲は実質的に(2010年11月であると仮定して)2010年10月1日00:00:00から2010年10月31日23: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');
于 2010-11-27T05:25:10.403 に答える