eygle.com   eygle.com
eygle.com  
 

« ITPUB年会回顾-阿里巴巴的数据库管理优化体系 | Blog首页 | 2007 我的新书写作计划 »

如何判断一个字符串是否为数字或日期?

作者:eygle |【转载时请务必以超链接形式标明文章和作者信息及本声明
链接:

昨天有一个朋友在MSN上问,如何判断一个字符串是否为数字?
我说,写一个函数吧。于是给出了一个例子:

SQL> CREATE OR REPLACE FUNCTION is_number (parmin VARCHAR2)
2 RETURN NUMBER
3 IS
4 val NUMBER;
5 BEGIN
6 val := TO_NUMBER (NVL (parmin, 'a'));
7 RETURN 1;
8 EXCEPTION
9 WHEN OTHERS
10 THEN
11 RETURN 0;
12 END;
13 /

Function created.

SQL> select is_number('a') from dual;

IS_NUMBER('A')
--------------
0

SQL> select is_number('0.998') from dual;

IS_NUMBER('0.998')
------------------
1

SQL> select is_number('9999999999999999') from dual;

IS_NUMBER('9999999999999999')
-----------------------------
1

今天,这个朋友在MSN上又问:如何判断一个字符是否是日期?
我说,再写一个函数吧。

补注:由于session的语言设置会影响日期的输出格式,所以时间被转换为字符可能有多种形式。
以下这个函数只能满足部分情况,仅供参考。

SQL> CREATE OR REPLACE FUNCTION is_date (parmin VARCHAR2)
2 RETURN NUMBER
3 IS
4 val DATE;
5 BEGIN
6 val := TO_DATE (NVL (parmin, 'a'), 'yyyy-mm-dd hh24:mi:ss');
7 RETURN 1;
8 EXCEPTION
9 WHEN OTHERS
10 THEN
11 RETURN 0;
12 END;
13 /

Function created.

SQL> select is_date('a') from dual;

IS_DATE('A')
------------
0

SQL> select is_date('2004-05-05') from dual;

IS_DATE('2004-05-05')
---------------------
1

SQL> select is_date('2004/01/01') from dual;

IS_DATE('2004/01/01')
---------------------
1

SQL> select is_date('01/01/04') from dual;

IS_DATE('01/01/04')
-------------------
1

SQL> select is_date('01-jan-04') from dual;

IS_DATE('01-JAN-04')
--------------------
1

这两者是何其相似啊!

-The End-

By eygle on 2007-02-05 10:16 | Comments (6) | Posted to FAQ | Edit |Pageviews:

相关文章 随机文章
  • Oracle10g中SCN与TimeStamp的相互转换
  • 如何通过DB link进行远程过程或函数调用
  • 使用分析函数进行行列转换
  • Oracle HowTo:如何使用Oracle的Decode函数进行多值判断
  • Oracle HowTo:如何使用Oracle case函数
  • Baby病了
    如何启用sqlplus的AutoTrace功能
    Metalink的替代访问站点
    收到Oracle ACE的名牌
    使用dbv和RMAN检查数据文件中的坏块
    网上相关主题:
    Google

    留言 (6)

    这是习惯的问题

    Posted by: anysql at February 5, 2007 10:59 AM

    日期的格式变万化[有点夸张],还真不好写个通用的判断方法,容易对初学者产生误导.正如d.c.b.a所说,习惯问题SQL> select sysdate from dual;

    SYSDATE
    --------------
    05-2月 -07

    SQL> select is_date('05-2月 -07') from dual;

    IS_DATE('05-2月-07')
    --------------------
    0

    SQL>

    Posted by: 托马斯张 at February 5, 2007 9:16 PM

    这就是区别.

    高手遇到问题,总是说:自己写一个吧!
    新手遇到问题,总是问:这个怎么实现?

    受益匪浅.

    Posted by: ricky at February 6, 2007 9:08 AM

    to tomas;
    对于不同语言设置,这个is_date还真不好写...

    Posted by: eygle at February 6, 2007 10:03 AM

    你的大名在itpub 中经常看到,敬仰。

    但你的function is_number 在coding 开发中可是犯了一个小小的忌讳 :)
    (当然很多人不这么认为)
    主要是将程序异常信息作为funtion 执行的返回结果,这在程序开发过程中是不允许的。

    CREATE OR REPLACE FUNCTION ISNUMERIC(pstr IN varchar2)

    RETURN boolean IS
    /*
    Created by Lis Li in 2004
    */

    blnTemp boolean;
    strTemp VARCHAR2(4000);
    begin

    blntemp:=false;

    strTemp:=TRANSLATE(pstr,

    '.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz`~!@#$%^*()<>,/\? "',

    '.0123456789') ;

    IF strTemp=pstr THEN

    IF scancnt(pstr,'.')>1 THEN

    RETURN false;

    ELSE

    RETURN true;

    END IF;

    ELSE

    RETURN false;

    END IF;

    END;
    /

    我认为这个函数比较符合程序开发。希望能给些建议。

    Posted by: myhuaer at May 16, 2007 2:09 PM

    to myhuaer;
    其实通过traslate函数转换,肯定是可以的,你的这个函数不过是将返回值变更为了布尔型。

    val := TO_NUMBER (NVL (parmin, 'a'));
    7 RETURN 1;
    ...

    这里改为布尔型返回值也是可以的,还要更简明一些。

    不过boolean的问题在于,不能够在函数中直接调用处理,还需要经过一次判断。

    SQL> CREATE OR REPLACE FUNCTION is_number2 (parmin VARCHAR2)
    2 RETURN boolean
    3 IS
    4 val NUMBER;
    5 BEGIN
    6 val := TO_NUMBER (NVL (parmin, 'a'));
    7 RETURN True;
    8 EXCEPTION
    9 WHEN OTHERS
    10 THEN
    11 RETURN False;
    12 END;
    13 /

    Function created.

    SQL> select is_number2('aa') from dual;
    select is_number2('aa') from dual
    *
    ERROR at line 1:
    ORA-06552: PL/SQL: Statement ignored
    ORA-06553: PLS-382: expression is of wrong type


    SQL> set serveroutput on
    SQL> begin
    2 if is_number2('11') then
    3 dbms_output.put_line('number');
    4 end if;
    5 end;
    6 /
    number

    PL/SQL procedure successfully completed.

    SQL>

    Posted by: eygle at May 16, 2007 4:43 PM

    发表留言:



    Remember Me?
    (输入验证码后方可评论,谢谢支持)



    CopyRight © 2004 eygle.com, All rights reserved.