我希望写一个case
声明来验证4位数年份是否正确。
例如,如果我选择ID
和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
有什么想法吗?
答案 0 :(得分:2)
试试这样:
select ID,
case
when extract(year from DT) between 1900 and 2050
then DT
else null
end as DT
from DB_TABLE;
答案 1 :(得分: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
的范围检查来检查,所以你应该是如果您有between
到1900
之类的年份范围,那么年仅2015
即可。如果您没有年份范围,则length
检查应足以在数据中找到“史前”年份。