检查字符串是否是有效日期

时间:2017-08-03 05:53:10

标签: oracle plsql

我有一个包含5个记录的字段sourcefilename的表。以下是记录。

SN. SOURCEFILENAME
1. 20170215095453_1.Iredell Memorial Hospital Dental Eligibility.xls_INFREPT01.txt
2. Iredell Memorial Hospital Eligibility April 2017.xls_INFREPT01.txt
3. Iredell Memorial Hospital Eligibility March 2017.xls_INFREPT01.txt
4. Iredell Memorial Hospital Eligibility May 2017.xls_INFREPT01.txt
5. Iredell Memorial Hospital October 2016 Dental Eligibility.xls_EligData.txt

我只需要提取前8个字符并检查它是否是有效日期。如果是有效日期,则返回TRUE,否则返回FALSE。

我尝试过ISDATE功能。还有其他选择吗?

SELECT DISTINCT SubStr(sourcefilename,1,8),
CASE WHEN isdate(SubStr(sourcefilename,1,8),'YYYYMMDD') = 1 THEN 'TRUE' ELSE 'FALSE' END  FROM ai_4451_1_metl;

3 个答案:

答案 0 :(得分:4)

Oracle 12.2提供了一个新功能VALIDATE_CONVERSION。到目前为止,我从未使用它,但我认为它会是这样的:

CASE VALIDATE_CONVERSION(SubStr(sourcefilename,1,8) AS DATE, 'YYYYMMDD') 
   WHEN 1 THEN 'TRUE'
   ELSE 'FALSE'
END

答案 1 :(得分:3)

没有Oracle built_in isdate()或不同命名的等价物(在12cR2之前的版本中)。但你可以写自己的:

create or replace function isdate
   ( p_date_str in varchar2 
     , p_date_fmt in varchar2 )
   return varchar2
is
    return_value varchar2(5);
    l_date date;
begin
    begin
        l_date := to_date(p_date_str, p_date_fmt);
        return_value := 'TRUE';
    exception
        when others then
            return_value := 'FALSE';
    end;
    return return_value;
end isdate;
/

如果将字符串转换为DATE数据类型,则成功它是一个有效的日期,否则它不是。

如果您的数据质量问题使您的字符串具有多种日期格式,那么您可以实施此备用解决方案。

create or replace function isdate
   ( p_date_str in varchar2  )
   return varchar2
is
    return_value varchar2(5) := 'FALSE';
    l_date date;
    l_date_fmts sys.dbms_debug_vc2coll := sys.dbms_debug_vc2coll (
         'DD-MON-YYYY'
         , 'YYYY-MM-DD'
         , 'DD-MM-YY'
            -- etc
         );

begin
    for idx in 1..l_date_fmts.count() loop
        begin
            l_date := to_date(p_date_str, l_date_fmts)idx) );
            return_value := 'TRUE';
            exit;
        exception
            when others then
                null;
        end;
    end loop;
    return return_value;
end isdate;
/

答案 2 :(得分:3)

如果您使用的是Oracle 12.2,则可以使用validate_conversion功能:

#!/usr/bin/env python3.5