Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle-检查空日期时出现不一致的数据类型错误_Oracle_Date - Fatal编程技术网

Oracle-检查空日期时出现不一致的数据类型错误

Oracle-检查空日期时出现不一致的数据类型错误,oracle,date,Oracle,Date,我正在尝试编写一个案例,说明日期为空,但我一直收到以下错误: ORA-00932: inconsistent datatypes: expected CHAR got DATE 00932. 00000 - "inconsistent datatypes: expected %s got %s" *Cause: *Action: 代码非常简单。与日期相比,是否有其他方法检查空值 case when cr.COMPLETED_DATE is null then '--'

我正在尝试编写一个案例,说明
日期
为空,但我一直收到以下错误:

ORA-00932: inconsistent datatypes: expected CHAR got DATE
00932. 00000 -  "inconsistent datatypes: expected %s got %s"
*Cause:    
*Action:
代码非常简单。与
日期
相比,是否有其他方法检查
空值

case
    when cr.COMPLETED_DATE is null then '--'
    else cr.COMPLETED_DATE
  end completed_date,

case表达式的两个分支获得不同的数据类型。如果该列为空,则表示您提供了一个字符串,
'--'
。如果不为空,则使用原始日期。这就是错误消息告诉您的

如果您希望null案例使用字符串,则not null案例还必须生成字符串,因此您必须使用合适的格式模型(不依赖NLS设置)将日期转换为字符串,例如:

case
    when cr.COMPLETED_DATE is null then '--'
    else to_char(cr.COMPLETED_DATE, 'YYYY-MM-DD')
  end completed_date,
使用CTE进行快速演示:

with cr (completed_date) as (
  select date '2016-09-23' from dual
  union all select null from dual
)
select
case
    when cr.COMPLETED_DATE is null then '--'
    else to_char(cr.COMPLETED_DATE, 'YYYY-MM-DD')
  end completed_date
from cr;

COMPLETED_
----------
2016-09-23
--        
大小写表达式的结果是两行的字符串

你也可以用它做同样的事情

nvl(to_char(cr.COMPLETED_DATE, 'YYYY-MM-DD'), '--') completed_date,

但是case更便于携带,而且通常更清晰。

这里的问题是
case when
语句的返回值

cr.COMPLETED_DATE is null then '--'
返回
字符串数据类型

else cr.COMPLETED_DATE
返回日期数据类型,因此出现错误

不一致的数据类型:预期的字符获取日期

解决方法之一是将第二个case条件的数据类型更改为char

case
    when cr.COMPLETED_DATE is null then '--'
    else to_char(cr.COMPLETED_DATE, 'dd-mm-yyyy')
end completed_date,
或者在日期为空时使用类似于“
1900-01-01
”的日期

case
    when cr.COMPLETED_DATE is null then Date '1900-01-01'
    else cr.COMPLETED_DATE
end completed_date,

有趣的是,MySQL使用ORA-xxxxx代码来处理错误消息?我以为那只是神谕。您的问题与Oracle数据库(与MySQL不同的产品,即使来自同一供应商)之间还有什么其他联系?我看到了Oracle标签,这是故意的还是偶然的?
ORA-00932
显示了它的Oracle,最好删除mysqltag@praveen哦,我没注意到,那家伙说mysql有问题,我的错,我和他们一起工作,把他们搞混了