2015-09-09 2 views
0

Я хотел был бы преобразовать поле дня платежа от AUTO_TABLE в день месяца. День оплаты хранится в формате строки, и первые девять дней хранятся как одиночный символ. Я хочу добавить строку «0» до дня платежа за день 1-9 и преобразовать полученную строку в «DD». Запрос работал в течение двух месяцев, но при попытке преобразовать строку в дату, Oracle выдает сообщение об ошибке «Недействительный месяц». Как я могу конвертировать день платежа в двухзначные десятичные знаки и перейти к объединению дня с текущим месяцем и годом? Спасибо за вашу помощь.Ошибка преобразования даты в sql

Select case when Payment_Day <> to_char(sysdate, 'dd') 
    then Payment_Day 
    end as Payment_day, 
    Payment_Day2, 
    trunc(sysdate) - 8 as DateEdit2, 
    trunc(sysdate) - 15 DateEdit1 

From(
Select case when Payment_Day2 > trunc(sysdate) 
    then Payment_day2 - 31 
    else Payment_Day2 end as Payment_Day2, 
    Payment_Day, theSysdate as theSysdate 

From(
Select distinct to_date(Payment_Day2, 'MM/DD/YYYY') as Payment_Day2, 
    Payment_Day, theSysdate 

     From(
     Select thePIDM, 
    to_char(DateEdit, 'MM') || '/' || to_char(Payment_Day, '00') || '/' || to_char(sysdate, 'YYYY') as Payment_Day2, 
    to_char(Payment_Day) as Payment_Day, Trunc(theSysdate) theSysdate 

       From (
        Select distinct PIDM as thePIDM, 
         to_char(Payment_Day) as Payment_Day, 
         trunc(sysdate) as DateEdit, 
         to_char(sysdate, 'DD') as theSysdate 

        from AUTO_TABLE 

        Group by PIDM, to_char(Payment_Day) 

        ) 

      ) 



     Order by Payment_Day2 
) 



Order by Payment_Day2 

) 
+2

выборки и вывод данных, желания помочь. –

+0

Самый внутренний подзапрос использует оба * DISTINCT * и * GROUP BY *. Это не ошибка, а перебор. Любой вариант даст тот же результат. Кроме того, если payment_day является * string *, вам не нужно преобразовывать его в char 'to_char (Payment_Day)' –

ответ

0

Запрос работал в течение двух месяцев. Да, вам повезло, что в июле и августе их пропустили, имея 31 день.

Проблема заключается в линии

 to_char(DateEdit, 'MM') || '/' || to_char(Payment_Day, '00') || '/' || to_char(sysdate, 'YYYY') as Payment_Day2, 

, который смешивают с payment_day на текущий месяц (от SYSDATE). Это приводит к недопустимым датам, таким как 09/31/2015.

Лекарства в снижении дня оплаты до последнего дня текущего месяца

 -- instead of  
     -- to_char(Payment_Day) as Payment_Day, 
     -- limit the payment day to the last day of the current month 
     to_char(least(to_number(Payment_Day),CAST(to_char(LAST_DAY(sysdate),'dd') AS INT))) as Payment_Day, 
Смежные вопросы