Как преобразовать другой формат строки в дату в оракуле - PullRequest
0 голосов
/ 06 сентября 2018

Рассмотрим table1 и table2.

table1 имеет Column1 со значением 'some_string Date: 00:30 05/16/2018 '

table2 имеет Column2 со значением 'some_string Date: 07-JUN-2018 '

Теперь мне нужно обновить table1 и table2, если требуется сначала найти дату по заданному строковому значению, а затем преобразовать эту дату в формат «ЧЧ24: MI: сс MM / DD / YYYY»

Здесь проблема заключается в необходимости обновления значения на разных серверах, где значение String может иметь дату в другом формате. Я пытался написать выше запрос, но он не работает.

update table2
set column2 = 'some_string Date: '
            || to_char ((SELECT SUBSTR(column2, INSTR(column2, ':') + 1) AS date_value
                         FROM table2),
                      'HH24:MI:ss MM/DD/YYYY')
            || ' '; 

1 Ответ

0 голосов
/ 06 сентября 2018

SQL Fiddle

Настройка схемы Oracle 11g R2 :

CREATE TABLE table1 ( column1 VARCHAR2(100) );

INSERT INTO table1 VALUES ( 'some_string Date: 00:30 05/16/2018 ' );

Запрос 1 :

MERGE INTO table1 dst
USING (
  WITH split ( rid, prefix, dt ) AS (
    SELECT ROWID,
           SUBSTR( column1, 1, INSTR( column1, 'Date: ' ) + 5 ),
           SUBSTR( column1, INSTR( column1, 'Date: ' ) + 6 )
    FROM   table1
    WHERE  INSTR( column1, 'Date: ' ) > 0
  ),
  converted_dts ( rid, prefix, dt ) AS (
    SELECT rid,
           prefix,
           CASE
           WHEN REGEXP_LIKE( dt, '^\s*\d?\d:\d\d \d?\d([/-])\d?\d\1\d{1,4}\s*$' )
           THEN TO_DATE( dt, 'HH24:MI MM/DD/YYYY' )
           WHEN REGEXP_LIKE( dt, '^\s*\d?\d([\-])(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NO|DEC)\1\d{1-4})\s*%' )
           THEN TO_DATE( dt, 'DD-MON-YYYY' )
           END
    FROM   split
  )
  SELECT rid,
         prefix,
         TO_CHAR( dt, 'HH24:MI:ss MM/DD/YYYY' ) AS dt
  FROM   converted_dts
  WHERE  dt IS NOT NULL
) src
ON ( dst.ROWID = src.RID )
WHEN MATCHED THEN
  UPDATE
  SET column1 = prefix || dt

Результаты

Запрос 2 :

SELECT *
FROM   table1

Результаты :

|                               COLUMN1 |
|---------------------------------------|
| some_string Date: 00:30:00 05/16/2018 |
...