Я начал с простой вставки записей, чтобы эмулировать вашу строку даты Excel.Вы можете использовать эту логику, чтобы увидеть, как могут быть выполнены преобразования.
SETUP
INSERT INTO myTable (baseDate)
SELECT 'JFM 14 - W/E 04/05/14' FROM dual
UNION ALL
SELECT 'AMJ 14 - W/E 06/05/14' FROM dual
UNION ALL
SELECT 'JAS 14 - W/E 09/05/14' FROM dual
UNION ALL
SELECT 'OND 14 - W/E 12/05/14' FROM dual
UNION ALL
SELECT 'JFM 15 - W/E 04/05/15' FROM dual
UNION ALL
SELECT 'AMJ 15 - W/E 06/05/14' FROM dual
UNION ALL
SELECT 'JAS 15 - W/E 09/05/14' FROM dual
UNION ALL
SELECT 'JAS 49 - W/E 03/05/49' FROM dual
UNION ALL
SELECT 'JAS 50 - W/E 04/05/50' FROM dual
В следующей строке SELECT
проверяется формат даты по умолчанию для вашего сервера.Это значение может повлиять на интерпретацию даты вашей строки.
SELECT value FROM v$nls_parameters WHERE parameter ='NLS_DATE_FORMAT';
| VALUE |
| :-------- |
| DD-MON-RR |
После того, как я вставлю значения, я могу просто обновить свою таблицу на основе этого значения.
UPDATE myTable
SET
DATE_ =
TO_DATE(
SUBSTR(baseDate,INSTR(baseDate, ' ', -1)+1,8) -- Find last space to get end of string date value.
, 'MM/DD/RR'
) /* TO_DATE already creates date object. RR mask rounds to 4-digit year. (49 = 1949, 50 = 2050) */
, QUARTER_ =
CASE SUBSTR(baseDate, 1, 3)
WHEN 'JFM' THEN 1
WHEN 'AMJ' THEN 2
WHEN 'JAS' THEN 3
WHEN 'OND' THEN 4
END
Для DATE_
вам не нужно делать TO_CHAR
, так как TO_DATE
преобразует вашу строку в значение даты для столбца даты в БД,Ваша база данных на самом деле не заботится о том, выглядит ли дата как «гггг-мм-дд», потому что она так или иначе не видит ее.Я использовал маску RR
, чтобы преобразовать двухзначное значение года в четырехзначное значение года.Это переведет 49
AS 2049
и 50
как 1950
.Если вам не нужны даты 19xx
, вы можете просто использовать YY
.Если вам нужно, вы можете выполнить дополнительную проверку вашего строкового значения, чтобы убедиться, что оно может быть преобразовано в дату.
Для QUARTER_
, это просто простое выражение CASE
, которое интерпретирует вашу строку четверти вчисло.
Затем я обновляю YEAR_
на основе значения даты в DATE_
.Это гарантирует, что мой год остается неизменным в ряду.Это также может быть выполнено при первоначальном обновлении, если значение извлечено из базовой строки.
UPDATE myTable
SET YEAR_ = EXTRACT ( YEAR FROM DATE_ )
Это дает нам:
BASEDATE | DATE_ | YEAR_ | QUARTER_
:-------------------- | :-------- | ----: | -------:
JFM 14 - W/E 04/05/14 | 05-APR-14 | 2014 | 1
AMJ 14 - W/E 06/05/14 | 05-JUN-14 | 2014 | 2
JAS 14 - W/E 09/05/14 | 05-SEP-14 | 2014 | 3
OND 14 - W/E 12/05/14 | 05-DEC-14 | 2014 | 4
JFM 15 - W/E 04/05/15 | 05-APR-15 | 2015 | 1
AMJ 15 - W/E 06/05/14 | 05-JUN-14 | 2014 | 2
JAS 15 - W/E 09/05/14 | 05-SEP-14 | 2014 | 3
JAS 49 - W/E 03/05/49 | 05-MAR-49 | 2049 | 3
JAS 50 - W/E 04/05/50 | 05-APR-50 | 1950 | 3
Поскольку DATE_
является фактическим объектом даты, на дисплее вы можете отформатировать его с любой маской.
db <> fiddle здесь