Вопрос

Пока я получил следующее:

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"

Другие советы

Пункт выбора оценивается после предложения Where в 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"
    
  • Или используйте выражение в предложении 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
    

Я бы остался вдали от выполнения арифмтика на возвращенной стоимости от 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;

Теперь запрос может использовать индекс на Delet_date. И 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-otce-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