5

曜日の文字列表現 (つまり、 MondayMardiالثلاثاءなど) と NLS_DATE_LANGUAGE が与えられた場合、この曜日が有効であることを検証する方法はありますか?

なぜこれが難しいのですか?これが単なる英語である場合、次のようなことを行うのは明らかです。

if <day_variable> in ('Monday','Tuesday', ...) then
   ...

私はこれをいくつかの国で拡張的に実行しようとしていますが、現在および将来のすべての NLS_DATE_LANGUAGE のすべての曜日を書き出すことを知らない (そして気にすることができない) ため、これは実際にはオプションではありません。 .

次のオプションは explicitTO_DATE()で、金曜日とうまく機能します。これは 5 月なので偶然だと思いますが、残りの週では惨めに失敗します。

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

これは興味深いエラーです...オラクルは次のことを推奨しています:

日付指定から曜日の値を削除するか、ユリウス日付の正しい曜日を入力してください。

曜日を削除することは、私が興味を持っているのはそれだけであり、ユリウス日がないため、ユリウス日に対して間違った曜日がないため、実際にはオプションではありません。

他の場所で提案されている回避策を確認し、別の日付形式 ( DydyFMDyなど) を使用すると、明らかに同じエラーが発生します。

オラクルは内部的にすべての日付をユリウス日として表しているように見え、この状況では混乱しています。

Oracle で指定された日が正しいことを確認するにはどうすればよいですか?

4

3 に答える 3

2

私が知る限り、可能なすべての日を生成するために、DB にパッチを適用するたびに次のようなものを実行することに固執しています (確かにそれを行うことを覚えていません)。

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

Doing this would not be at all extensible as if I were to need the day of the week (i.e. 1, 2, 3, etc.) the value is based on the current NLS_TERRITORY, which means there's no possible consistency.

to_char(sysdate + l, 'D', 'nls_date_language=''' || value || '') as day_of_week

I'd then have to create a non-deterministic, :-(, function to validate whether the string is (in)correct:

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;
于 2015-05-05T08:33:20.987 に答える