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"
لكن هذا يعطيني خطأ:
ORA-00904: "Current_month": معرف غير صالح
ولكن بدون شرط أين ، يعمل بشكل جيد. أيه أفكار؟
المحلول
لسوء الحظ ، لا يمكنك الرجوع إلى الأسماء المستعارة في العمود في الفقرة حيث لم تكن متوفرة بعد. يمكنك إما القيام بذلك:
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. هذا هو السبب في أن البند الذي لا يمكن رؤية الأسماء المستعارة التي حددتها.
أيضاً:
قم بتشغيل مسمة فرعية:
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 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. عند طرح 1 من السلسلة "01" (Januari) ، لن ينتهي الأمر بـ 12 (ديسمبر).
يجب أن تفعل شيئًا كهذا:
select *
from hol_depart_dates
where depart_date between trunc(add_months(sysdate, -1), 'MM')
and trunc(sysdate, 'MM') - interval '1' second;
الآن يمكن للاستعلام استخدام فهرس على المغادرة. ولا يجب استدعاء TO_CHAR لكل صف.
إذا كنت ترغب في مقارنة التواريخ ، فيجب ألا تقوم بتحويلها إلى سلاسل - قامت Oracle ببناء دعم لحساب التاريخ/الوقت.
في حالتك ، يبدو أنك تستفسر عن الجدول حيث يكون شهر تاريخ المغادرة مساوياً للشهر السابق - وهو أمر غير منطقي. إذا كان ذلك حاليًا ، فسيعود الاستعلام إلى صفوف من أكتوبر 2010 ، أكتوبر 2009 ، أكتوبر 2008 ، وما إلى ذلك ، هل أنت متأكد من أن هذا ما تريده؟
واحدة من أفضل الطرق لاستخدام حساب التاريخ لتحديد ما إذا كان التاريخ في الشهر السابق هو استخدام مجموعة من trunc (التاريخ ، "الشهر") ، الذي يعيد اليوم الأول من الشهر الحالي ، مع Add_months (التاريخ ،--- 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" ثانية واحدة من التاريخ ، وبالتالي يصبح نطاق التاريخ فعليًا (على افتراض أنه الآن نوفمبر 2010) 01-Oct-2010 00:00:00 إلى 31 أكتوبر -2010 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');