在Oracle中按名称验证星期几

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中验证命名日是否正确?

Ben*_*Ben 2

据我所知,每次我们修补数据库(当然不会记得这样做)时,我都会坚持运行类似以下的内容来生成所有可能的日子

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)