2010-11-26 4 views

답변

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

자리에서, 여러분 모두, 지금은 훨씬 더 의미가 있습니다! – Coffeee

2

SELECT 절은 SQL의 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 
    
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" 
  • 또는 표현식을 사용하는 절은 어디 반환 값에 대한 arithmtic 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

    날짜를 비교하려면 문자열로 변환하면 안됩니다. Oracle은 날짜/시간 산술을 지원합니다.

    귀하의 경우, 출발일의 달이 이전 달과 동일한 테이블을 쿼리하는 것 같습니다. 이는 의미가 없습니다. 현재 11 월이면 쿼리에서 2010 년 10 월, 2009 년 10 월, 2008 년 10 월 등의 행을 반환합니다. 원하는 것이 맞습니까?

    날짜 계산이 이전 달 내에 있는지를 결정하는 가장 좋은 방법 중 하나는 현재 달의 첫날을 반환하는 TRUNC (날짜, 'MONTH') 조합을 ADD_MONTHS와 함께 사용하는 것입니다 (date, -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"는 날로부터 제를 감산하므로 기간 효과적으로 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');