我有个存储过程,关键代码如下:……
Open cursor for
SELECT * from sometable T where '05-AUG-2010' BETWEEN NVL(T.END_EFFDATE, T.POL_START_DT) AND   T.POL_END_DT;
……
在oracle 服务器上直接执行是正确的,我在本机用c#代码调用这个存储过程也是正确的。但是同样的代码换另一台机器调用,就报错Not a valid month,好像是日期格式不对。我检查了2台客户机器的区域,语言,时间格式设置都一样。
这会是什么问题?
为什么我仅仅是调用放在oracle服务器上的存储过程,结果会因为客户端机器而不同呢?

解决方案 »

  1.   

    -- 这样修改一下吧:
    Open cursor for
      SELECT * from sometable T 
      where  to_date('05-AUG-2010','dd-mon-yyyy','NLS_DATE_LANGUAGE = ''AMERICAN''')
      BETWEEN NVL(T.END_EFFDATE, T.POL_START_DT) AND T.POL_END_DT;-- 其实:日期字段没有你这样比较的!
      

  2.   

    SELECT * from sometable T where TO_DATE('05-AUG-2010','yyyy-mm-dd') BETWEEN NVL(T.END_EFFDATE, T.POL_START_DT) AND T.POL_END_DT;
      

  3.   

    SELECT * from sometable T where TO_DATE('05-AUG-2010','dd-mm-yyyy') BETWEEN NVL(T.END_EFFDATE, T.POL_START_DT) AND T.POL_END_DT;
      

  4.   

    -- 请看:
    scott@TBWORA> select TO_DATE('05-AUG-2010','dd-mon-yyyy') from dual;
    select TO_DATE('05-AUG-2010','dd-mon-yyyy') from dual
                   *
    第 1 行出现错误:
    ORA-01843: 无效的月份
    scott@TBWORA> alter session set nls_date_language=american;会话已更改。scott@TBWORA> select TO_DATE('05-AUG-2010','dd-mon-yyyy') from dual;TO_DATE('05-
    ------------
    05-AUG-10-- 我之所以第一次执行语句: select TO_DATE('05-AUG-2010','dd-mon-yyyy') from dual;
    -- 失败,是因为我的系统的默认日期语言是简体中文,而你提供的日期格式中 '05-AUG-2010' 是英文,
    -- 与我的默认日期格式不匹配,所以出错!-- 当我修改了当前会话的日期语言后,执行就成功啦!
      

  5.   

    -- 所以:像你这样的日期格式,与日期语言有关(AUG)的话,最好在查询中指定日期格式的同时,指定匹配的日期语言,-- 例如:
    select to_date('05-AUG-2010','dd-mon-yyyy','NLS_DATE_LANGUAGE = ''AMERICAN''') from dual;select to_date('05-1月-2010','dd-mon-yyyy','NLS_DATE_LANGUAGE = ''SIMPLIFIED CHINESE''') from dual;
      

  6.   

    请问楼上,我查询了oracle 服务器上的语言设置是nls_date_language=American。
    所以我才直接写了AUG,没有加格式转换。
    为什么不同机器调用时候,会和各自客户端的系统语言有关,而不是以服务器上为准呢?
    我主要疑惑的是这个问题。
      

  7.   

    而且在某台机器上,直接用sqlplus连接到服务器,执行该存储过程是正确的。
    但是在C#代码里调用,就出错了,这又是为什么?
      

  8.   

    -- 我们一般习惯日期格式用:YYYY-MM-DD,这样就不会遇到日期语言不匹配的问题!-- 例如:select to_date('2011-08-10','yyyy-mm-dd') from dual;-- 上面语句应该是在任何Oracle平台都能成功执行,
    -- 不管你当前会话的nls_date_language参数的值是多少!
    -- 这样也就避免了你这样的错误的出现几率!