我希望写一个case语句,将验证一个4位数的年份是正确的或不正确。
例如,如果我选择了日期和日期(数据类型是DT ),而日期是错误的,那么就不显示它。
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放入date列:
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有什么想法吗?
发布于 2012-08-15 23:06:12
像这样试一下:
select ID,
case
when extract(year from DT) between 1900 and 2050
then DT
else null
end as DT
from DB_TABLE;发布于 2012-08-15 23:12:10
像这样的东西
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的范围检查来检查,所以如果你有一个像1900到2015这样的年份范围,你应该可以只使用between作为年份。如果您没有年份范围,那么length检查应该足以在数据中找到“史前”年份。
https://stackoverflow.com/questions/11971745
复制相似问题