지금까지 나는 다음있어오라클 SQL 이전 달 쿼리 문제
ORA-00904: "Current_Month": invalid identifier
을 그러나 WHERE 절없이, 그것을 잘 작동합니다. 어떤 아이디어?
지금까지 나는 다음있어오라클 SQL 이전 달 쿼리 문제
ORA-00904: "Current_Month": invalid identifier
을 그러나 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 절 후 평가됩니다. 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"
또는 표현식을 사용하는 절은 어디 반환 값에 대한 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은 모든 행에 대해 호출 할 필요는 없습니다.
TRUNC (SYSDATE, 'MM')에서 전체 하루를 빼기 때문에, 해당 월의 마지막 날에있는 출발 날짜를 놓칠 수 있습니다 (시간이 자정 12 시가 아닌 경우). –
Opps, 잘 발견되었습니다. 이제 해결되었습니다. – Ronnis
날짜를 비교하려면 문자열로 변환하면 안됩니다. 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');
자리에서, 여러분 모두, 지금은 훨씬 더 의미가 있습니다! – Coffeee