【发布时间】:2021-11-23 09:07:02
【问题描述】:
我的 (SAP IdM) 应用程序中有以下 SQL 代码:
Select mcmskeyvalue as MKV,v1.searchvalue as STARTDATE, v2.avalue as Running_Changes_flag
from idmv_entry_simple
inner join idmv_value_basic_active v1 on mskey = mcmskey and attrname = 'Start_of_company_change'
and mcentrytype = 'MX_PERSON' and to_date(v1.searchvalue,'YYYY-MM-DD')<= sysdate+3
left join idmv_value_basic v2 on v2.mskey = mcmskey and v2.attrname = 'Running_Changes_flag'
where mcmskey not in (Select mskey from idmv_value_basic_active where attrname = 'Company_change_running_flag')
我已经找到了 ORA-01841 问题的解决方案,因为它可能是类似于 MSSQL 的 try_to_date 的解决方案,如下所述:How to handle to_date exceptions in a SELECT statment to ignore those rows?
或者我将代码更改为这样的解决方案,以仅在字符串上工作:
Select mcmskeyvalue as MKV,v1.searchvalue as STARTDATE, v2.avalue as Running_Changes_flag
from idmv_entry_simple
inner join idmv_value_basic_active v1 on mskey = mcmskey and attrname = 'Start_of_company_change'
and mcentrytype = 'MX_PERSON' and v1.searchvalue<= to_char(sysdate+3,'YYYY-MM-DD')
left join idmv_value_basic v2 on v2.mskey = mcmskey and v2.attrname = 'Running_Changes_flag'
where mcmskey not in (Select mskey from idmv_value_basic_active where attrname = 'Company_change_running_flag')
所以对于实际问题,我有一个解决方案。
但现在我开始与我的客户和队友讨论为什么会发生错误。
基本上对于符合“attrname = 'Start_of_company_change'”要求的 idmv_value_basic_activ 的所有条目,我们可以确定这些是日期。此外,如果我们执行查询以检查将要传递的所有值,则所有值均采用有效格式。
我在大学里了解到,DB-Engine 可以决定以何种顺序运行查询的各个部分。所以对我来说,最合乎逻辑的解释是,在开发环境(我们面临问题的地方),“to_date(v1.searchvalue,'YYYY-MM-DD')
现在我的问题是:
第一:我记得对吗,因为老师说只有一次,当时我真的无法理解它
第二:我的这个假设是正确的还是有其他原因导致这个问题?
边境信息:
该工具使用一种移位数据结构,这就是为什么在 idmv_value_basic_activ 视图的实际“搜索值”列中可以有很多不同类型的原因。数据库层的数据类型始终是 varchar 类型。
【问题讨论】:
标签: sql oracle database-theory