"недействительный месяц" - оракул - PullRequest
0 голосов
/ 21 февраля 2019
CREATE TABLE MRE_BUDGET as (
   select OUTBOUND, INBOUND, vehicle_size, rental_date as start_date, TO_CHAR(TO_DATE((LEAD(Rental_date) over (partition by OUTBOUND, INBOUND, vehicle_size order by OUTBOUND, INBOUND, vehicle_size, rental_date)), 'YYYYMMDD')-1, 'YYYYMMDD') as end_date, Rate  
   from (select OUTBOUND, INBOUND, vehicle_size, rental_date, Avg(RATE) as RATE from mre_competitor_data1 where competitor='BUDGET' group by OUTBOUND, INBOUND, vehicle_size, rental_date)
   where rental_date <= (select cpd from mre_system_parameters));

и ошибка говорит " недопустимый месяц " ... Мне нужно удалить даты, у которых нет действительного месяца?Не уверен, как это сделать ??

1 Ответ

0 голосов
/ 21 февраля 2019

Мне нужно удалить даты, у которых нет действительного месяца?

Данные исходной таблицы не имеют дат в действительные месяцы - это (почти) невозможно при использовании правильных типов данных.Ошибка возникает из-за неявных преобразований, которые создают строки в одном формате, после явных преобразований обратно в даты с использованием другого формата.

В настоящее время вы делаете:

 TO_CHAR(
   TO_DATE(
     (LEAD(Rental_date) over (partition by OUTBOUND, INBOUND, vehicle_size
        order by OUTBOUND, INBOUND, vehicle_size, rental_date)),
     'YYYYMMDD'
   )-1,
   'YYYYMMDD'
 ) as end_date,

As rental_date(надеюсь) столбец даты, передача его - независимо от lead() - в to_date() означает, что вы действительно делаете:

 TO_CHAR(
   TO_DATE(
     TO_CHAR(
       LEAD(Rental_date) over (partition by OUTBOUND, INBOUND, vehicle_size
         order by OUTBOUND, INBOUND, vehicle_size, rental_date)m
       <your_current_NLS_DATE_FORMAT>,
      ),
     'YYYYMMDD'
   )-1,
   'YYYYMMDD'
 ) as end_date,

с вашим NLS_DATE_FORMAT, не соответствующим форматам, которые вы используете явнопотом.В качестве такого же надуманного примера с фиксированной датой:

select
  TO_CHAR(
    TO_DATE(
      TO_CHAR(
        date '2019-02-28',
        'DD-MM-YYYY' -- guessing your NLS_DATE_FORMAT
      ),
      'YYYYMMDD'
     ) -1,
    'YYYYMMDD'
  )
from dual;

ORA-01843: not a valid month

Вы могли бы просто ошибиться в своих TO_CHAR и TO_DATE:

select
  TO_DATE(
    TO_CHAR(
      date '2019-02-28',
      'YYYYMMDD'
     ) -1,
    'YYYYMMDD'
  )
from dual;

TO_DATE(TO
----------
2019-02-27

, но яне уверен, почему вы вообще конвертируете значение, когда можете просто:

select date '2019-02-28' - 1
from dual;

DATE'2019-
----------
2019-02-27

или в вашем случае:

LEAD(Rental_date) over (partition by OUTBOUND, INBOUND, vehicle_size
  order by OUTBOUND, INBOUND, vehicle_size, rental_date) - 1 as end_date

, что на месте, с удалением лишних скобок, можетвыглядеть так:

CREATE TABLE MRE_BUDGET as
select OUTBOUND, INBOUND, vehicle_size, rental_date as start_date,
  LEAD(Rental_date) over (partition by OUTBOUND, INBOUND, vehicle_size
    order by OUTBOUND, INBOUND, vehicle_size, rental_date) - 1 as end_date,
  Rate  
from (
  select OUTBOUND, INBOUND, vehicle_size, rental_date, Avg(RATE) as RATE
  from mre_competitor_data1
  where competitor='BUDGET'
  group by OUTBOUND, INBOUND, vehicle_size, rental_date
)
where rental_date <= (select cpd from mre_system_parameters));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...