0

我正在寻找一份case声明,以验证 4 位数年份是否正确。

例如,如果我选择了IDand DT(数据类型为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

我的目标是编写一个查询,当日期不正确时将 null 放在日期列中:

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

有任何想法吗?

4

2 回答 2

2

试试这样:

select ID,
  case
    when extract(year from DT) between 1900 and 2050
      then DT
    else null
  end as DT
from DB_TABLE;
于 2012-08-15T15:06:11.997 回答
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;

您可以定义自己的比较逻辑,与上述逻辑相反。

因此,对于您的查询-

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被认为是 Oracle 中的有效年份,但是这可以通过范围检查使用 来检查,所以如果你有一个年份范围between,你应该只接受year 。如果您没有年份范围,那么检查应该足以在数据中找到“史前”年份。between19002015length

于 2012-08-15T15:12:10.423 回答