DB2:如何以String格式验证日期,这是一种varchar数据类型

时间:2014-03-04 10:07:20

标签: sql database validation db2

我需要知道varchar类型列中的数据是否具有正确的日期格式。 我必须在DB2中做同样的事情。

我在java中通过在异常处理的帮助下使用SimpleDateFormat()和Date.Parse()函数来完成此操作。

我发布了我的java代码来验证字符串到目前为止

private boolean isValidDate(String date) {
    try{
        DateFormat d = new SimpleDateFormat("yyyyMMdd");
        d.setLenient(false);
        d.parse(date);
        return true;
    }
    catch(Exception e){
        return false;
    }
}

但现在我必须在 DB2数据库中做同样的事情。可以使用DB2中的任何函数或进程

表格栏中的数据是这样的..

20140231

20000101

YYYYMMDD

列类型为varchar

2 个答案:

答案 0 :(得分:1)

我的展示日期的风格:

 try
     {
 Date dob = new SimpleDateFormat("yyyy-MMM-dd").parse(request.getParameter("date"));
     user.setDate(date);
     }
       catch(ParseException e)
       {
           e.printStackTrace();
       }

注意:如果你应该像yyyy-MMM-dd或MM / dd / yyyy那样给予

您的计划:

private boolean isValidDate(String date) 
{
try
{
DateFormat d = new SimpleDateFormat("MMM/dd/yyyy").parse(request.getParameter("date"));
        d.setLenient(false);
        d.parse(date);
        return true;
    }
    catch(Exception e)
    {
        return false;
    }
}

varchar的时间戳:

<强>时间戳的表达

一个表达式,它返回一个必须是DATE或TIMESTAMP的值,或者一个不是CLOB或DBCLOB的日期或时间戳的有效字符串表示形式。

如果参数是字符串,则还必须指定format-string参数。

在Unicode数据库中,如果提供的参数是数据,时间或时间戳的图形字符串表示,则在评估函数之前首先将其转换为字符串。

如果timestamp-expression是DATE或日期的有效字符串表示形式,则首先将其转换为TIMESTAMP(0)值,假设时间恰好是午夜(00.00.00)。

有关datetime值的字符串表示形式的有效格式,请参阅“Datetime values”中的“datetime values的字符串表示形式”。

<强>格式字符串

表达式必须返回一个值,该值是内置的CHAR,VARCHAR,numeric或datetime数据类型。

如果该值不是CHAR或VARCHAR数据类型,则在评估函数之前将其隐式转换为VARCHAR。

在Unicode数据库中,如果提供的参数是GRAPHIC或VARGRAPHIC数据类型,则在评估函数之前首先将其转换为VARCHAR。实际长度不得超过254个字节(SQLSTATE 22007)。

该值是一个模板,用于表示timestamp-expression的格式。

有效的格式字符串必须包含下面列出的格式元素的组合(SQLSTATE 22007)。

两个格式元素可以选择用以下一个或多个分隔符分隔:

minus sign (-)
period (.)
slash (/)
comma (,)
apostrophe (')
semi-colon (;)
colon (:)
blank ( )

请注意:

click 1

click2

<强> 更新:

示例代码1:将当前日期转换为YYYYMM格式

SELECT DATE_FORMAT(NOW(), '%Y%m');

o / p:#201403

示例代码2:将当前日期转换为YYYYMM格式

 SELECT VARCHAR_FORMAT(CURRENT_DATE, 'YYYYMM') FROM jmail;

o / p#201403

details of date_format

样品:

No | MySQL                         |      DB2                           |SampleOutput

1  | DATE_FORMAT(NOW(), '%Y-%m-%d) | VARCHAR_FORMAT(CURRENT_DATE,'YYYY-MM-DD')| 2013-02-14

2  | DATE_FORMAT(NOW(), '%d/%m/%y')| VARCHAR_FORMAT(CURRENT_DATE,'DD/MM/RR')  |  14/02/13

答案 1 :(得分:1)

不清楚&#34;味道&#34;需要DB2。使用DB2 for i,我可能会创建一个函数来进行测试并返回成功或失败的指示。这是一个适合我的例子:

DROP SPECIFIC FUNCTION SQLEXAMPLE.CHKVCDATE ; 

SET PATH "QSYS","QSYS2","SYSPROC","SYSIBMADM","SQLEXAMPLE" ; 

CREATE FUNCTION SQLEXAMPLE.CHKVCDATE ( 
    VCDATE VARCHAR(20) ) 
    RETURNS INTEGER   
    LANGUAGE SQL 
    SPECIFIC SQLEXAMPLE.CHKVCDATE 
    DETERMINISTIC 
    CONTAINS SQL 
    RETURNS NULL ON NULL INPUT 
    NO EXTERNAL ACTION 
    NOT FENCED 
    SET OPTION  ALWBLK = *ALLREAD , 
    ALWCPYDTA = *OPTIMIZE , 
    COMMIT = *CHG , 
    CLOSQLCSR = *ENDMOD , 
    DECRESULT = (31, 31, 00) , 
    DFTRDBCOL = *NONE , 
    DYNDFTCOL = *NO , 
    DYNUSRPRF = *USER , 
    SRTSEQ = *HEX   

    BEGIN ATOMIC 

DECLARE CHKDATE DATE ; 
DECLARE VALIDDATE INT ; 

DECLARE NOT_VALID CONDITION FOR '22007' ; 
DECLARE CONTINUE HANDLER FOR NOT_VALID 
    SET VALIDDATE = -1 ; 

SET VALIDDATE = 0 ; 

VALUES ( VCDATE ) INTO CHKDATE ; 

RETURN VALIDDATE ; 

END  ; 

COMMENT ON SPECIFIC FUNCTION SQLEXAMPLE.CHKVCDATE 
    IS 'Check VARCHAR for valid date' ;

可以删除或更改不适合您的特定DB2的任何属性或其他详细信息。 VCDATE VARCHAR parm的大小可能需要调整,RETURN值可以是您需要的任何值。该函数可能在WHERE子句中有用。

我可以像这样调用它:

select sqlexample.chkvcdate('2014-02-29'), sqlexample.chkvcdate('2014-02-28') from sysibm.sysdummy1

第一个将返回(-1)表示无效值,第二个将返回(0)表示无效。