Мне нужно удалить даты, у которых нет действительного месяца?
Данные исходной таблицы не имеют дат в действительные месяцы - это (почти) невозможно при использовании правильных типов данных.Ошибка возникает из-за неявных преобразований, которые создают строки в одном формате, после явных преобразований обратно в даты с использованием другого формата.
В настоящее время вы делаете:
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));