比较日期时,Oracle SQL相关子查询中键入不匹配错误

时间:2013-12-09 21:53:09

标签: sql oracle type-mismatch

我正在执行一个大的Oracle SQL select语句,在外部查询的select部分中有多个(大约25个)相关子查询。基本思路是:

SELECT DISTINCT column1, column2, ..., (select from ... where ...), ...
FROM table1, table2, table3 ...
WHERE ...
AND ...
ORDER BY column1

我陷入了每个相关子查询中存在的下面一段代码:

AND to_date(foin.BEGINDATUM, 'dd/mm/yyyy') 
BETWEEN to_date(beha.STARTDATUM, 'dd/mm/yyyy') 
AND to_date(beha.EINDDATUM, 'dd/mm/yyyy')

在某些情况下,我收到错误'type mismatch'。 这段代码确保来自具有别名'foin'的一个表中的一些数据具有两个日期之间的起始日期,该另一个表别名为'beha'。所有列都具有DATE数据类型,它们可能具有NULL值,但即使在我的代码段中添加NVL函数,它仍然会给出类型不匹配错误。

以下解决方案是一个好主意,但没有解决错误消息:

AND trunc(foin.BEGINDATUM) BETWEEN trunc(beha.STARTDATUM) 
AND trunc(NVL(beha.EINDDATUM, '01/01/2100'))

有人有想法吗?

编辑:相关问题:这个错误只是通过比较两个具有不同数据类型的字段或将日期与NULL值进行比较或者是否有其他解释引起的?

Edit2:这个oracle sql查询的结果被放入MS Excel,连接是用ODBC做的,我真的不知道。这个错误可能与MS Excel有关吗?

1 个答案:

答案 0 :(得分:1)

由于所有三列都已包含数据类型date,因此无需调用to_date。这会强制将日期隐式转换为varchar2,使用会话的当前NLS_DATE_FORMAT,然后使用指定的格式掩码显式转换回date。如果两个掩码不同,您将收到错误。

假设您要忽略所有三列的时间组件

AND trunc( foin.begindatum ) BETWEEN trunc( beha.startdatum ) 
                                 AND trunc( beha.einddatum )