我有一个小的效用函数,用于计算给定日期的星期几:
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,但必须在我的电脑上提供。我尝试了以下但没有成功:
有什么建议吗?
提前致谢!
答案 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。