Пример данных у вас не очень ясно; что именно делает quarter_name
? Я предположил, что это все в начале строки, вплоть до первого свидания. Если это так, посмотрите, поможет ли что-то подобное. Даже если не сразу, этот принцип вы можете изменить. Я бы посоветовал вам сделать это шаг за шагом, точно так же, как я, пытаясь разделить каждую часть на свою строку для лучшей читаемости.
SQL> with test (quarter_name, start_period, end_period) as
2 (select 'Q-FISCAL FY20 Q3', date '2020-01-26', date '2020-04-25' from dual union all
3 select 'Q-FISCAL FY20 Q2', date '2019-10-27', date '2020-01-25' from dual union all
4 select 'Q-FISCAL FY20 Q1', date '2019-07-28', date '2019-10-26' from dual union all
5 --
6 select 'Q-FISCAL FY18 Q3', date '2018-01-26', date '2018-04-26' from dual
7 )
8 select
9 regexp_replace(quarter_name,
10 substr(quarter_name, instr(quarter_name, ' ') + 1, 4),
11 --
12 substr(quarter_name, instr(quarter_name, ' ') + 1, 2)
13 ||
14 to_char(
15 to_date (
16 substr(quarter_name, instr(quarter_name, ' ') + 3, 2),
17 'rrrr'
18 ),
19 'rrrr'
20 )
21 ) new_quarter_name,
22 --
23 start_period,
24 end_period
25 from test;
NEW_QUARTER_NAME START_PERI END_PERIOD
-------------------- ---------- ----------
Q-FISCAL FY2020 Q3 01/26/2020 04/25/2020
Q-FISCAL FY2020 Q2 10/27/2019 01/25/2020
Q-FISCAL FY2020 Q1 07/28/2019 10/26/2019
Q-FISCAL FY2018 Q3 01/26/2018 04/26/2018
SQL>
Что это делает?
- строки # 1 - 7: выборочные данные; он уже есть в таблице, поэтому необходимый код начинается со строки № 8
- строка № 9: замените
quarter_name
's ... - строка № 10: ... 4 символы, следующие за первым пробелом (например,
FY20
) ... - строки # 12 - 20: ... с
- строка # 12: первые 2 символа, следующие за первый пробел (
FY
), объединенный с ... - строками # 14 - 20: ... значение года увеличено до 4 символов (например, с 20 до 2020 или с 18 до 2018)
- строка # 16: годовая часть подстроки
FY20
(например, 20
или 18
) - строка # 17: применить к ней маску формата
rrrr
(используя функцию to_date
) так что это становится например 2020
; если бы это была yyyy
маска формата, вы бы получили 0020
. В результате получается, например, 01/01/2020 00:00:00
- полная дата со временем - строка # 19: примените ту же маску формата
rrrr
к этому значению даты (используя функцию to_char
), чтобы извлечь только год из, например, 01/01/2020 00:00:00