首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于验证年份的案例语句

用于验证年份的案例语句
EN

Stack Overflow用户
提问于 2012-08-15 22:58:37
回答 2查看 2.4K关注 0票数 0

我希望写一个case语句,将验证一个4位数的年份是正确的或不正确。

例如,如果我选择了日期和日期(数据类型是DT ),而日期是错误的,那么就不显示它。

代码语言:javascript
复制
SELECT ID, to_char(DT,'yyyy-mm-dd hh:mm:ss') from DB_TABLE

将导致以下结果:

代码语言:javascript
复制
ID  DT
1   0208-03-25 12:26:00
2   2008-04-01 13:45:18
3   2000-11-15 13:45:18

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

代码语言:javascript
复制
select ID, case when DT is not valid then null else dt from DB_TABLE

将导致以下结果:

代码语言:javascript
复制
ID  DT
1   null
2   2008-04-01 13:45:18
3   2000-11-15 13:45:18

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-15 23:06:12

像这样试一下:

代码语言:javascript
复制
select ID,
  case
    when extract(year from DT) between 1900 and 2050
      then DT
    else null
  end as DT
from DB_TABLE;
票数 2
EN

Stack Overflow用户

发布于 2012-08-15 23:12:10

像这样的东西

代码语言:javascript
复制
    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;

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

所以对于你的查询-

代码语言:javascript
复制
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的范围检查来检查,所以如果你有一个像19002015这样的年份范围,你应该可以只使用between作为年份。如果您没有年份范围,那么length检查应该足以在数据中找到“史前”年份。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11971745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档