0

我有一列,其中一个字符串以 - '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 
4

3 回答 3

2

你可以使用:

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( ... )

于 2016-06-06T14:34:09.667 回答
1

如果您的列值始终以开头,'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评论是错误的

于 2016-06-06T14:25:59.643 回答
1

好吧,您可以采取直接方法并使用正则表达式,例如您找到的示例:

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;

但这只有在所有日期都采用完全相同的格式时才能正常工作。完整的月份名称,首字母大写、空格、日、逗号、空格、4 位数年份。如果可以有多个空格或根本没有\s*空格,请在正则表达式中使用代替空格。如果月份名称不一定是 initcap,请使用initcap()on source 或不区分大小写的regexp_substr功能标志。

此外,这将捕获符合格式的虚假日期,例如“1234 年 4 月 99 日”,您必须稍后过滤它们。

于 2016-06-06T14:27:42.863 回答