Sql 在Oracle中检查日期格式

Sql 在Oracle中检查日期格式,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我在下面的一个过程中选择了查询。我需要为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_UNI

我在下面的一个过程中选择了查询。我需要为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

一个选项可能是创建一个函数,该函数尝试使用
to_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;
/

一个选项可能是创建一个函数,该函数尝试使用
to_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;
/

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

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
选择案例
当不象REGEXP_时(日期字符串“^(0[1-9]| 1[12])(0[1-9]|[12]\d | 3[01])\d{4}$)
然后是“00000000”
什么时候开始(
加上个月(
TRUNC(TO_DATE(SUBSTR(datestring,5),'YYYY'),'YYYY'),
TO_编号(SUBSTR(datestring,1,2))-1
)
+TO_编号(SUBSTR(datestring,3,2))-1,
“mmddyyy”
)
日期字符串
然后是“00000000”
ELSE日期字符串
结束
从你的桌子上

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

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
选择案例
当不象REGEXP_时(日期字符串“^(0[1-9]| 1[12])(0[1-9]|[12]\d | 3[01])\d{4}$)
然后是“00000000”
什么时候开始(
加上个月(
TRUNC(TO_DATE(SUBSTR(datestring,5),'YYYY'),'YYYY'),
TO_编号(SUBSTR(datestring,1,2))-1
)
+TO_编号(SUBSTR(datestring,3,2))-1,
“mmddyyy”
)
日期字符串
然后是“00000000”
ELSE日期字符串
结束
从你的桌子上


支票应该是什么?检查字符串的长度?它总是一个数字字符串吗?它是否总是以不同的格式表示日期,或者它可以是任何值?例如,您的数据中是否存在类似“02312017”的字符串?请尝试更好地描述您在起始数据上了解的内容。是否有任何东西可以确定有效年份的构成?1900年之后有什么事吗?@Aleksej:输入数据类型是varchar2(254)。我的意思是,只有当输入的格式为正确的MMDDYYYY时,才应该返回输入值。01222016。否则,它应该返回“00000000”。问题是您可能需要处理哪些情况。如果你对输入数据有一些假设,也许一些SQL逻辑就足够了,但是如果你不能对它说什么,我相信你应该考虑函数方法。正如我所提到的,SQL逻辑我需要的是:只有当输入是正确的MMDYYYY格式时,输入值才应该返回。01222016。否则,它应该返回“00000000”。我不喜欢在我的项目中使用函数概念,因为它不被推荐。还有其他方法吗?检查应该是什么?检查字符串的长度?它总是一个数字字符串吗?它是否总是以不同的格式表示日期,或者它可以是任何值?例如,您的数据中是否存在类似“02312017”的字符串?请尝试更好地描述您在起始数据上了解的内容。是否有任何东西可以确定有效年份的构成?1900年之后有什么事吗?@Aleksej:输入数据类型是varchar2(254)。我的意思是,只有当输入的格式为正确的MMDDYYYY时,才应该返回输入值。01222016。否则,它应该返回“00000000”。问题是您可能需要处理哪些情况。如果你对输入数据有一些假设,也许一些SQL逻辑就足够了,但是如果你不能对它说什么,我相信你应该考虑函数方法。正如我所提到的,SQL逻辑我需要的是:只有当输入是正确的MMDYYYY格式时,输入值才应该返回。01222016。否则,它应该返回“00000000”。我不喜欢在我的项目中使用函数概念,因为它不被推荐。还有别的办法吗?谢谢。。除了使用函数,还有其他方法吗?我的客户端不想使用此功能的函数。有没有办法在SELECT查询本身中嵌入所需的功能?@prabuR使用SQL解决方案进行了更新,但该功能要简单得多。谢谢。。除了使用函数,还有其他方法吗?我的客户端不想使用此功能的函数。有没有办法将所需的功能嵌入SELECT查询本身?@prabuR使用SQL解决方案进行了更新,但该功能要简单得多。
VARCHAR2(6)
不适合8个字符的字符串。此外,
MMDDYYYY
格式掩码将在公元0015年10月5日解析
100515
,而不会引发异常-OP声明这应该返回
00000000
。非常正确,一个简单的条件语句可以检查字符串的长度是否合适,这与其说是一个完整的解决方案,不如说是一个开始
VARCHAR2(6)
将不适合8个字符的字符串。另外,
MMDDYYYY
格式掩码将解析
100515
为公元0015AD年10月5日,而不会引发异常-OP声明此