Как преобразовать YY в YYYY, пример ниже, если я запустил пример ниже, я получу за год '0007':

   DECLARE
       lv_promcode_txt VARCHAR(6) := 'A0807X';
       lv_prommth_txt VARCHAR2(7);
       lv_promyear_txt VARCHAR2(7);
   BEGIN
       lv_prommth_txt := SUBSTR(lv_promcode_txt, 2,2);
       DBMS_OUTPUT.PUT_LINE('Month of promo code is: '|| 
       TO_(TO_DATE(lv_prommth_TXT,'MM'), 'MONTH'));

       lv_promyear_txt := SUBSTR(lv_promcode_txt, 4,2);
       DBMS_OUTPUT.PUT_LINE('Year of promo code is: '||TO_CHAR(TO_DATE  
       (lv_promyear_txt, 'YYYY'),'YYYY'));
   END;
1
DKCroat 3 Янв 2018 в 05:05

2 ответа

Лучший ответ

Ваша маска формата неверна. Пример:

   select TO_CHAR(TO_DATE (SUBSTR('A0807X', 4,2), 'YY'),'YYYY') from dual

Возвращает 2007

3
OldProgrammer 3 Янв 2018 в 02:48

Замените последнюю часть кода DBMS_OUTPUT.PUT_LINE на

DBMS_OUTPUT.PUT_LINE('Year of promo code is ( Style 1 ) : '||TO_CHAR(TO_DATE(lv_promyear_txt, 'YYYY'),'YYYY'));
DBMS_OUTPUT.PUT_LINE('Year of promo code is ( Style 2 ) : '||TO_CHAR(TO_DATE(lv_promyear_txt, 'RRRR'),'YYYY'));

Просто изменить YYYY литерал RRRR в функции TO_DATE.

Эта концепция связана с year 2k problem.

Для даты TO_DATE('18', 'RRRR') дает результат 2018 как год (для
текущее столетие и the last two digits of years находятся между 00 - 49),

< EM> , а

Для даты TO_DATE('74', 'RRRR') дает результат 1974 как год (для
предыдущее столетие и the last two digits of years находятся между 50 - 99)

3
Barbaros Özhan 3 Янв 2018 в 05:25