如何在同一个数据库实例上生成相同的to_char()结果,但是来自不同的会话?

时间:2013-05-10 16:56:57

标签: oracle oracle11g to-char nls-lang

我有一个小的效用函数,用于计算给定日期的星期几:

select to_number(to_char(to_date('20130330', 'YYYYMMDD'),'D')) from dual;

在同一个数据库实例上执行此语句,但是从两台不同的机器上生成两个不同的结果!

问题是:如何修改代码以便在两台不同的PC上获得相同的结果但使用相同的数据库实例?

详细

当我使用这些nls_session参数从我的电脑启动会话时,结果为6

select * from nls_session_parameters;

NLS_LANGUAGE    HUNGARIAN
NLS_TERRITORY   HUNGARY
NLS_CURRENCY    Ft
NLS_ISO_CURRENCY    HUNGARY
NLS_NUMERIC_CHARACTERS  , 
NLS_CALENDAR    GREGORIAN
NLS_DATE_FORMAT RR-MON-DD
NLS_DATE_LANGUAGE   HUNGARIAN
NLS_SORT    HUNGARIAN
NLS_TIME_FORMAT HH24.MI.SSXFF
NLS_TIMESTAMP_FORMAT    RR-MON-DD HH24.MI.SSXFF
NLS_TIME_TZ_FORMAT  HH24.MI.SSXFF TZR
NLS_TIMESTAMP_TZ_FORMAT RR-MON-DD HH24.MI.SSXFF TZR
NLS_DUAL_CURRENCY   Ft
NLS_COMP    BINARY
NLS_LENGTH_SEMANTICS    BYTE
NLS_NCHAR_CONV_EXCP FALSE

相同的数据库实例通过从具有这些会话参数的其他PC启动会话来得到不同的结果:7

PARAMETER    VALUE
NLS_LANGUAGE    AMERICAN
NLS_TERRITORY    AMERICA
NLS_CURRENCY    $
NLS_ISO_CURRENCY    AMERICA
NLS_NUMERIC_CHARACTERS    .,
NLS_CALENDAR    GREGORIAN
NLS_DATE_FORMAT    DD-MON-RR
NLS_DATE_LANGUAGE    AMERICAN
NLS_SORT    BINARY
NLS_TIME_FORMAT    HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT    DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT    HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT    DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY    $
NLS_COMP    BINARY
NLS_LENGTH_SEMANTICS    BYTE
NLS_NCHAR_CONV_EXCP    FALSE

对我来说,正确的结果是7,但必须在我的电脑上提供。我尝试了以下但没有成功:

  • 将NLS_LANGUAGE更改为AMERICAN
  • 使用带有可选nls_language参数
  • 的to_char()

有什么建议吗?

提前致谢!

3 个答案:

答案 0 :(得分:1)

星期几的操作设置为NLS_TERRITORY

答案 1 :(得分:1)

如果您可以发出alter session,那么NLS_TERRITORY可能就是这样,正如@JoachimIsaksson所说。但是如果你不能,那么不幸的是TO_CHAR()不支持通过其可选的nlsparms参数动态修改它。

你可以作为最后的手段蛮力,例如在匈牙利会议上:

alter session set nls_language = 'HUNGARIAN';

select to_char(to_date('20130330', 'YYYYMMDD'), 'DY') as hungarian,
    to_char(to_date('20130330', 'YYYYMMDD'),
        'DY', 'NLS_DATE_LANGUAGE=AMERICAN') as american
from dual;

HUN AME
--- ---
SZO SAT

select case to_char(to_date('20130330', 'YYYYMMDD'),
    'DY', 'NLS_DATE_LANGUAGE=AMERICAN')
        when 'SUN' then 1 when 'MON' then 2 when 'TUE' then 3
        when 'WED' then 4 when 'THU' then 5 when 'FRI' then 6
        when 'SAT' then 7
    end as american
from dual;

  AMERICAN
----------
         7

......这很丑陋,但避免了更改会话的任何副作用。如果这在一个以上的地方成为一个问题,你可以把它变成一个函数。

答案 2 :(得分:0)

对于国际惯例,只需使用 trunc(date)-trunc(date,'IW')+1 如果您更喜欢美国惯例,则为 trunc(date+1)-trunc(date+1,'IW')+1。