2012-08-15 64 views
0

我正在寻找编写case声明来验证4位数年份是否正确。验证年度的案例声明

例如,如果我选择IDDT(数据类型为DATE),并且日期错误,请不要显示它。

SELECT ID, to_char(DT,'yyyy-mm-dd hh:mm:ss') from DB_TABLE 

会导致如下:

ID DT 
1 0208-03-25 12:26:00 
2 2008-04-01 13:45:18 
3 2000-11-15 13:45:18 

我的目标是写在日期列把空查询时的日期是不正确的:

select ID, case when DT is not valid then null else dt from DB_TABLE 

会导致如下:

ID DT 
1 null 
2 2008-04-01 13:45:18 
3 2000-11-15 13:45:18 

任何想法?

+0

你'dt'字段没有'date'数据类型吗? – Taryn 2012-08-15 15:01:58

+1

什么是“有效日期”? – Mat 2012-08-15 15:03:23

+0

@bluefeet是的,DT列的数据类型是日期。 – 2012-08-15 15:06:48

回答

2

试试这样说:

select ID, 
    case 
    when extract(year from DT) between 1900 and 2050 
     then DT 
    else null 
    end as DT 
from DB_TABLE; 
0

像这样的事情

select case 
     when length (to_char(extract(year from to_date('0208-03-25','YYYY-MM-DD')))) < 4 
      or extract(year from to_date('0208-03-25','YYYY-MM-DD')) not between 1800 and 2013 
      then NULL   
     else to_date('0208-03-25','YYYY-MM-DD') 
     end as DT 
    from dual; 

为并列以上的人在上面,你可以定义自己的比较逻辑。

因此,对于你的query

select ID, case 
      when length (to_char(extract(year from DT))) < 4 
       or extract(year from DT) not between 1800 and 2013 
       then NULL 
      else DT 
      end as DATE_DT 
from DB_TABLE; 

我之所以有< 4全年为0208被认为是甲骨文有效的一年,但是这可以通过使用between范围检查来检查,所以你应该如果您的年份范围为19002015,则只需between即可。如果您没有年份范围,那么length检查就足以找到数据中的“史前”年份。