我正在执行一个大的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有关吗?
答案 0 :(得分:1)
由于所有三列都已包含数据类型date
,因此无需调用to_date
。这会强制将日期隐式转换为varchar2
,使用会话的当前NLS_DATE_FORMAT
,然后使用指定的格式掩码显式转换回date
。如果两个掩码不同,您将收到错误。
假设您要忽略所有三列的时间组件
AND trunc( foin.begindatum ) BETWEEN trunc( beha.startdatum )
AND trunc( beha.einddatum )