CAST(NULL为日期)

时间:2015-01-07 14:28:04

标签: oracle oracle11g db2 oracle-sqldeveloper

我正在尝试在oracle中创建一个已在DB2中定义的视图,在DB2视图中所有日期列都具有强制转换功能,下面我通过从视图中取一个日期列创建了一个视图。注意:COBDATE列具有与设计相关的数字数据类型。我收到ORA-00936:表达式错误。

Create View MYVIEWV1 as (Select
A.COBDATE                   ,
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
 (case when (COBDATE = 0)
  then  CAST(NULL AS DATE)
  else
   date(SUBSTR(COBDATE,1,4) ||
   '-'||SUBSTR(COBDATE,5,2) ||
   '-'||SUBSTR(COBDATE,7,2))
       end )  as    COBDATE2 
from MYTBLT1 A;

请建议我如何将其转换为oracle语法?

2 个答案:

答案 0 :(得分:4)

cast不是问题,但并不是真的需要。针对第7行第4列报告了“缺少表达式”错误,这是对date()函数的调用 - 这在Oracle中不存在。期望日期文字遵循关键字date,而不是括号或函数参数。

您可以使用to_date()函数,格式模型与您构造第一个参数的方式相匹配。你说cobdate是一个数字,但是你把它当成一个字符串,所以我会继续隐含地这样做......

create table mytblt1 (cobdate number);
insert into mytblt1 values (20141225);
insert into mytblt1 values (0);

create view myviewv1 as
select cobdate,
  case when cobdate = 0
    then null -- or with unnecessary cast: cast(null as date)
  else
    to_date(substr(cobdate,1,4)
        ||'-'||substr(cobdate,5,2)
        ||'-'||substr(cobdate,7,2),
      'YYYY-MM-DD')
  end as cobdate2 
from mytblt1;

select * from myviewv1;

   COBDATE COBDATE2          
---------- -------------------
  20141225 2014-12-25 00:00:00 
         0                     

desc myviewv1

Name     Null Type   
-------- ---- ------ 
COBDATE       NUMBER 
COBDATE2      DATE   

使用缩减日期格式模型 - 因此您不必担心-分隔符 - 您可以进一步简化它:

create view myviewv1 as
select cobdate,
  case when cobdate = 0
    then null -- cast(null as date)
  else
    to_date(cobdate, 'YYYYMMDD')
  end as cobdate2 
from mytblt1;

或者您可以在函数调用中移动case

create view myviewv1 as
select cobdate,
  to_date(case when cobdate = 0 then null else cobdate end, 'YYYYMMDD') as cobdate2 
from mytblt1;

答案 1 :(得分:2)

Nulls不需要施法。只需单独使用NULL即可。

case when COBDATE = 0 then NULL
else <some date> end as COBDATE2

也不需要所有这些括号。