سؤال

حتى الآن لدي ما يلي:

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');
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top