检查Oracle中的DATE格式

时间:2017-05-17 07:37:23

标签: sql oracle oracle11g

我在程序中有SELECT查询。我需要为SUBMTD_SRVC_DATE列添加另一个验证检查。如果SUBMTD_SRVC_DATE的值是除了' MMDDYYYY'以外的任何格式,那么我需要填充' 00000000'。假设,如果SUBMTD_SRVC_DATE =' 100515',那么我需要自动填充' 00000000'。

有人可以请你。提前谢谢。

SELECT CASE WHEN SMS.SRVC_UNITS IS NULL OR SMS.SRVC_UNITS = -8888 OR SMS.SRVC_UNITS = -9999 THEN '0000000' ELSE LPAD( SMS.SRVC_UNITS , 7 , '0') END
                    || CASE WHEN ( SMS.SUBMTD_SRVC_DATE IS NULL OR UPPER(SMS.SUBMTD_SRVC_DATE) = 'NOT AVAILABLE') THEN '00000000' ELSE SMS.SUBMTD_SRVC_DATE END  AS FILE_VAL
FROM SUBMTD_MED_SRVC SMS

2 个答案:

答案 0 :(得分:2)

创建用户定义的函数并尝试解析日期;如果有任何异常,则捕获它们并返回默认字符串。

CREATE FUNCTION check_Date (
  datestring    VARCHAR2,
  format_mask   VARCHAR2 := 'FXMMDDYYYY',
  default_value VARCHAR2 := '00000000'
) RETURN VARCHAR2 DETERMINISTIC
IS
  INVALID_DATE EXCEPTION;
  PRAGMA EXCEPTION_INIT( INVALID_DATE, -20001 );

  p_date DATE;
BEGIN
  IF datestring IS NULL THEN
    RAISE INVALID_DATE;
  END IF;

  p_date := TO_DATE( datestring, format_mask );

  RETURN datestring;
EXCEPTION
  WHEN OTHERS THEN
    RETURN default_value;
END check_Date;
/

<强>替代

SELECT CASE
       WHEN NOT REGEXP_LIKE( datestring, '^(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])\d{4}$' )
       THEN '00000000'
       WHEN TO_CHAR(
              ADD_MONTHS(
                TRUNC( TO_DATE( SUBSTR( datestring, 5 ), 'YYYY' ), 'YYYY' ),
                TO_NUMBER( SUBSTR( datestring, 1, 2 ) ) - 1
              )
              + TO_NUMBER( SUBSTR( datestring, 3, 2 ) ) - 1,
              'MMDDYYYY'
            )
            <> datestring
       THEN '00000000'
       ELSE datestring
       END
FROM   your_table

答案 1 :(得分:0)

一个选项可能是创建一个尝试使用TO_DATE将您收到的输入转换为真实DATE的函数。如果成功,则表示您的日期有效,并返回原始字符串,如果失败并抛出异常,则捕获异常并返回'000000'

create or replace function validate_date_string (
     p_date_string varchar2
)
return varchar2
is
l_date date;
l_date_string varchar2(8);
begin
    l_date_string := p_date_string;
    begin
        l_date := to_date (p_date_string, 'MMDDYYYY');
    exception
        when others then l_date_string := '000000'; 
    end;
    return l_date_string;
end;
/