如何在oracle中将不同的字符串格式转换成日期
How to convert different string format into date in oracle
考虑 table1
和 table2
。
table1
的 Column1
值为 'some_string Date: 00:30 05/16/2018 '
table2
的 Column2
值为 'some_string Date: 07-JUN-2018 '
现在我需要同时更新 table1
和 table2
,其中要求首先从给定的字符串值中找到日期,然后将该日期转换为格式 'HH24:MI:ss MM/DD/YYYY'
这里的问题是需要更新不同服务器上的值,其中字符串值可能具有不同格式的日期。我试着写上面的查询,但它不起作用。
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')
|| ' ';
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\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)\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 |
考虑 table1
和 table2
。
table1
的 Column1
值为 'some_string Date: 00:30 05/16/2018 '
table2
的 Column2
值为 'some_string Date: 07-JUN-2018 '
现在我需要同时更新 table1
和 table2
,其中要求首先从给定的字符串值中找到日期,然后将该日期转换为格式 'HH24:MI:ss MM/DD/YYYY'
这里的问题是需要更新不同服务器上的值,其中字符串值可能具有不同格式的日期。我试着写上面的查询,但它不起作用。
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')
|| ' ';
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\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)\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 |