从视图中选择数据会引发错误

时间:2014-02-15 03:17:57

标签: sql oracle plsql

我输入2011/11/13 00:00:00。所以我把查询作为:

select * from xxcust_pfoa434p_vw 
where week_ending_date = to_date(substr(:value,1,10),'YYYY/MM/DD') 

当查询其他表时,相同的语句会给出正确的结果。但是当我针对视图xxcust_pfoa434p_vw

查询时抛出错误

我有一个视图xxcust_pfoa434p_vw,它有一个date_ending_date列的日期数据类型。 该列中的值类似于3/2/2014,12/25/2011 i.e. MM/DD/YYYY

甚至

select * from xxcust_pfoa434p_vw where week_ending_date='3/2/2014'

也给出了  ORA-01843:不是有效月份。导致此错误的原因是什么。

3 个答案:

答案 0 :(得分:1)

你说

  

"当查询其他语句时,相同的语句会给出正确的结果   表。但是当我在视图中查询时抛出错误   xxcust_pfoa434p_vw"

很明显,问题在于观点。你也说

  

" [视图]有一个日期数据类型的week_ending_date列。价值   该栏目就像3/2 / 2014,12 / 25/2011,即MM / DD / YYYY"

如果系统的默认日期掩码为MM / DD / YYYY,那么这些值只会显示。这很容易检查查询

select * from V$NLS_PARAMETERS
where parameter = 'NLS_DATE_FORMAT';

就个人而言,我的钱在该栏目上并非日期栏目。 ORA-01841始终指示oracle尝试将字符串转换为日期并查找不适合显式或默认格式掩码的值。加上所谓的日期' 3/2 2014'缺乏领先的零,这也是可疑的。

我认为编写该视图的人决定修复week_ending_date的格式,因此部署TO_CHAR以呈现字符串而不是日期数据类型。 SQL * Plus中的DESC或查看ALL_VIEWS中的视图TEXT将显示答案。

答案 1 :(得分:0)

即使你看到这种格式的格式化日期 - 它只是一个直观的表示,当oracle处理你的查询时它会自动将你给出的字符串转换成它自己的内部表示。

最好使用正确的SQL YYYY-MM-DD:

第二次游行

select * from xxcust_pfoa434p_vw where week_ending_date = to_date('2014-03-02', 'YYYY-MM-DD')

2月3日: select * from xxcust_pfoa434p_vw where week_ending_date = to_date('2014-02-03', 'YYYY-MM-DD')

这符合SQL标准,不会在DD/MM/YYYYMM/DD/YYYY

之间产生混淆

引用standard

  

< datetime field> s的重要性排序。这个   是,从最重要到最不重要:年,月,日,   小时,分钟和秒。

更新:总是使用to_date函数指定确切的格式并避免依赖任何类型的本地化设置是个好主意

答案 2 :(得分:0)

select * from xxcust_pfoa434p_vw 
where week_ending_date=to_date('03/02/2014','MM/DD/YYYY');