从字符串oracle中提取日期
Extract date from string oracle
我有一个字符串以 - 'Chicago, IL, April 20, 2015 — and so on text here' 开头的列。我想从 Oracle 中的这个字符串中提取日期部分。关于如何做到这一点的任何想法。我能够找到像下面这样的 mm/dd/yyyy 的内容,但不能找到长日期格式的内容。
SELECT REGEXP_SUBSTR(' the meeting will be on 8/8/2008', '[0-9]{1,}/[0-9]{1,}/[0-9]{2,}') FROM dual
如果您的列值始终以 'Chicago, IL, April 20, 2015 — and so on text here'
开头,那么您可以简单地使用 SUBSTR
而不是 REGEXP_SUBSTR
SELECT
SUBSTR(column_name
,INSTR(column_name, ',', 1, 2) + 1
,INSTR(column_name, '—') - INSTR(column_name, ',', 1, 2) - 1
)
FROM
dual;
如果不是那么你可以使用 REGEXP_SUBSTR
作为其他答案提及,我原来的答案是错误的 @MTO
评论
好吧,您可以采取直接的方法并使用正则表达式,就像您找到的示例中那样:
SELECT
REGEXP_SUBSTR('Chicago, IL, April 20, 2015 - etc etc', '(January|February|March|April|May|June|July|August|September|October|November|December) [0-9]{1,2}, [0-9]{4}')
FROM dual;
但这只有在所有日期都采用完全相同的格式时才能正常工作。首字母大写的完整月份名称,space,日期,逗号,space,4 位年份。如果可以有多个 space 或根本没有 space,请在正则表达式中使用 \s*
而不是 space。如果月份名称不一定是 initcap,请在 regexp_substr
函数的源或不区分大小写的标志上使用 initcap()
。
此外,这将捕获符合格式的虚假日期,例如 "April 99, 1234",您稍后必须过滤它们。
您可以使用:
SELECT TO_DATE(
REGEXP_SUBSTR(
'Chicago, IL, April 20, 2015 — and so on text here',
'(JANUARY|FEBRUARY|MARCH|APRIL|MAY|JUNE|JULY|AUGUST|SEPTEMBER|'
|| 'OCTOBER|NOVEMBER|DECEMBER)'
|| '[[:space:]]+([012]?[0-9]|3[01])'
|| '[[:punct:][:space:]]+\d{4}',
1,
1,
'i'
),
'MONTH DD YYYY'
)
FROM DUAL;
如果您还想验证日期(这样您就不会收到 February 29, 2001
的错误),那么您可以使用用户定义的函数:
CREATE FUNCTION parse_Date(
in_string VARCHAR2,
in_format VARCHAR2 DEFAULT 'YYYY-MM-DD',
in_nls_params VARCHAR2 DEFAULT NULL
) RETURN DATE DETERMINISTIC
AS
BEGIN
RETURN TO_DATE( in_string, in_format, in_nls_params );
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END;
/
并将TO_DATE( ... )
函数替换为PARSE_DATE( ... )
我有一个字符串以 - 'Chicago, IL, April 20, 2015 — and so on text here' 开头的列。我想从 Oracle 中的这个字符串中提取日期部分。关于如何做到这一点的任何想法。我能够找到像下面这样的 mm/dd/yyyy 的内容,但不能找到长日期格式的内容。
SELECT REGEXP_SUBSTR(' the meeting will be on 8/8/2008', '[0-9]{1,}/[0-9]{1,}/[0-9]{2,}') FROM dual
如果您的列值始终以 'Chicago, IL, April 20, 2015 — and so on text here'
开头,那么您可以简单地使用 SUBSTR
而不是 REGEXP_SUBSTR
SELECT
SUBSTR(column_name
,INSTR(column_name, ',', 1, 2) + 1
,INSTR(column_name, '—') - INSTR(column_name, ',', 1, 2) - 1
)
FROM
dual;
如果不是那么你可以使用 REGEXP_SUBSTR
作为其他答案提及,我原来的答案是错误的 @MTO
评论
好吧,您可以采取直接的方法并使用正则表达式,就像您找到的示例中那样:
SELECT
REGEXP_SUBSTR('Chicago, IL, April 20, 2015 - etc etc', '(January|February|March|April|May|June|July|August|September|October|November|December) [0-9]{1,2}, [0-9]{4}')
FROM dual;
但这只有在所有日期都采用完全相同的格式时才能正常工作。首字母大写的完整月份名称,space,日期,逗号,space,4 位年份。如果可以有多个 space 或根本没有 space,请在正则表达式中使用 \s*
而不是 space。如果月份名称不一定是 initcap,请在 regexp_substr
函数的源或不区分大小写的标志上使用 initcap()
。
此外,这将捕获符合格式的虚假日期,例如 "April 99, 1234",您稍后必须过滤它们。
您可以使用:
SELECT TO_DATE(
REGEXP_SUBSTR(
'Chicago, IL, April 20, 2015 — and so on text here',
'(JANUARY|FEBRUARY|MARCH|APRIL|MAY|JUNE|JULY|AUGUST|SEPTEMBER|'
|| 'OCTOBER|NOVEMBER|DECEMBER)'
|| '[[:space:]]+([012]?[0-9]|3[01])'
|| '[[:punct:][:space:]]+\d{4}',
1,
1,
'i'
),
'MONTH DD YYYY'
)
FROM DUAL;
如果您还想验证日期(这样您就不会收到 February 29, 2001
的错误),那么您可以使用用户定义的函数:
CREATE FUNCTION parse_Date(
in_string VARCHAR2,
in_format VARCHAR2 DEFAULT 'YYYY-MM-DD',
in_nls_params VARCHAR2 DEFAULT NULL
) RETURN DATE DETERMINISTIC
AS
BEGIN
RETURN TO_DATE( in_string, in_format, in_nls_params );
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END;
/
并将TO_DATE( ... )
函数替换为PARSE_DATE( ... )