如何从VARCHAR2列中提取MM/DD/YYYY格式的日期值
从混合数据的VARCHAR2列提取MM/DD/YYYY格式日期
方法1:筛选单一内容行中的日期
如果列中每行仅包含单一内容(如示例所示,每行要么是日期、要么是其他字符串/数字),用REGEXP_LIKE精准匹配格式即可:
SELECT your_column AS extracted_date FROM your_table WHERE REGEXP_LIKE(your_column, '^\d{2}/\d{2}/\d{4}$');
正则规则说明:
^:匹配字符串起始位置\d{2}:匹配两位数字(对应月份、日期)/:匹配日期分隔符\d{4}:匹配四位数字(对应年份)$:匹配字符串结束位置
这个规则会排除纯数字、带字母的内容,只保留严格符合MM/DD/YYYY格式的行。
方法2:提取行内嵌入的日期
如果行中同时包含日期和其他文本(比如Annual Report 12/31/2019),用REGEXP_SUBSTR提取日期部分:
SELECT REGEXP_SUBSTR(your_column, '\d{2}/\d{2}/\d{4}') AS extracted_date FROM your_table WHERE REGEXP_SUBSTR(your_column, '\d{2}/\d{2}/\d{4}') IS NOT NULL;
可选:验证日期有效性
如果需要确保提取的是真实有效的日期(排除13/32/2020这类格式对但逻辑错的内容),结合日期转换做验证:
Oracle 12c及以上版本(支持TRY_CAST):
SELECT your_column AS extracted_date FROM your_table WHERE REGEXP_LIKE(your_column, '^\d{2}/\d{2}/\d{4}$') AND TRY_CAST(your_column AS DATE, 'MM/DD/YYYY') IS NOT NULL;
旧版本Oracle:
SELECT your_column AS extracted_date FROM your_table WHERE REGEXP_LIKE(your_column, '^\d{2}/\d{2}/\d{4}$') AND EXISTS ( SELECT 1 FROM DUAL WHERE TO_DATE(your_column, 'MM/DD/YYYY') IS NOT NULL );
内容的提问来源于stack exchange,提问作者RatnakarRao M
相关产品推荐
相关产品推荐

