Ben*_*Ben 5 sql oracle nls-lang
给定一周中某一天的字符串表示(即星期一,Mardi,الثلاثاء等)和NLS_DATE_LANGUAGE,是否有任何方法可以验证每周的这一天是否有效?
你为什么这么难?好吧,如果这只是英语,那么显而易见的事情就是如下:
if <day_variable> in ('Monday','Tuesday', ...) then
...
Run Code Online (Sandbox Code Playgroud)
我正在尝试这样做,可扩展地,对于几个国家,并且我不知道(并且不能打扰)写出所有当前和未来NLS_DATE_LANGUAGE的所有日子,这不是一个真正的选择.
下一个选项是一个明确的TO_DATE(),它与星期五一起很好地工作- 我怀疑这是一个巧合,因为它是五月,但在本周其余时间失败了:
SQL> select to_date('Friday', 'Day') as d from dual;
D
----------
2015-05-01
SQL> select to_date('Monday', 'Day') as d from dual;
select to_date('Monday', 'Day') as d from dual
*
ERROR at line 1:
ORA-01835: day of week conflicts with Julian date
Run Code Online (Sandbox Code Playgroud)
这是一个有趣的错误...... Oracle建议:
从日期规范中删除星期几值或输入Julian日期的星期几.
删除一周中的某一天并不是一个真正的选择,因为我感兴趣的是所有这一切,因为我没有Julian日期,所以我的Julian日期没有错误的一周.
解决方法的其他地方提出确认和使用替代日期格式(Dy,dy,FMDy等)相当明显地导致同样的错误.
它看起来好像甲骨文代表所有的日期内为Julian日期,在这种情况感到困惑.
如何在Oracle中验证命名日是否正确?
据我所知,每次我们修补数据库(当然不会记得这样做)时,我都会坚持运行类似以下的内容来生成所有可能的日子
select value as language
, to_char(sysdate + l, 'FMDay', 'nls_date_language=''' || value || '') as name_of_day
from v$nls_valid_values
cross join ( select level as l from dual connect by level <= 7 )
where parameter = 'LANGUAGE'
and isdeprecated = 'FALSE'
order by language
Run Code Online (Sandbox Code Playgroud)
这样做根本无法扩展,就好像我需要一周中的某一天(即 1、2、3 等),该值基于当前的 NLS_TERRITORY,这意味着不可能存在一致性。
to_char(sysdate + l, 'D', 'nls_date_language=''' || value || '') as day_of_week
Run Code Online (Sandbox Code Playgroud)
然后我必须创建一个非确定性的 :-(, 函数来验证字符串是否正确:
create or replace function is_day_of_week (
PDay in varchar2
, PDate_Language
) return number is
l_ct number;
begin
select count(*) into l_ct
from days_of_the_week
where name_of_day = PDay
and language = PDate_Language;
return l_ct;
end is_day_of_week;
Run Code Online (Sandbox Code Playgroud)