to_char()
の最初の引数として使用した値が一重引用符で囲まれていないため、投稿したものからエラーが発生します。
select to_date(01-jan-12,'dd-mon-yy') from dual;
ORA-00904: "JAN": invalid identifier
何の引用符がないので、jan
は識別子として解釈され、何の列コールJAN
があなたのアドレステーブルに(おそらく)はありません。 2桁の年を使用することも悪い習慣です。実際には古いデータから、通常はRR
をYY
よりも使用する必要があります。月の名前もNLS設定の影響を受けますので、月の数字を名前よりも安全に使用できます。実際に名前が必要な場合は、to_char()
関数に言語を制御する第3引数があります。
これは非常に複雑な方法で行いますが、十分な行を持つアドレステーブルに頼っています。小文字で曜日名をDAY
の代わりにday
で指定し、大文字にしてから、最初に指定した文字列のビットを取り除きます。 - 唯一の曜日の名前を取得すると、NLSの設定は、とにかくあなたに英語の名前を与えるという前提(再び)を比較すると...不必要に複雑です。固定文字列リテラルに対してupper()
を呼び出すと、あなたは既に大文字で入力できます。
あなたはこれらのいずれか、またはその他の変形を行うことができます
代わりの
WHERE upper(regexp_substr(TO_CHAR(dates,'day-mon-yy'),'([[:alpha:]])+'))=upper('FRIDAY');
:
WHERE regexp_substr(TO_CHAR(dates,'DAY-mon-
y'),'([[:alpha:]])+')=upper('FRIDAY');
WHERE TO_CHAR(dates,'DAY')='FRIDAY ';
WHERE TRIM(TO_CHAR(dates,'DAY'))=upper('FRIDAY');
WHERE TO_CHAR(dates,'FMDAY','NLS_DATE_LANGUAGE=ENGLISH')='FRIDAY';
あなたはdual
テーブルに対して、階層的なクエリを使用してアドレステーブルに頼って避けることができます:
SELECT next_day(date '2012-01-01' - 1, 'FRIDAY') + (7 * (level - 1))
FROM dual
CONNECT BY next_day(date '2012-01-01' - 1, 'FRIDAY') + (7 * (level - 1))
<= date '2012-03-31';
next_day
も使用していますしかしNLSの設定に、あなたは常にセッションの日付言語を制御することができない限り、それはすべての日付を取得し、NLSに依存しない方法でそれらをフィルタリングする(少し効率的な場合)の方が安全かもしれませんので:
SELECT dates, to_char(dates, 'FMDAY')
FROM (
SELECT date '2012-01-01' + level - 1 AS dates
FROM dual
CONNECT BY level <= date '2012-03-31' - date '2012-01-01'
)
WHERE to_char(dates, 'FMDAY', 'NLS_DATE_LANGUAGE=ENGLISH') = 'FRIDAY';
DATES TO_CHAR(DATES,'FMDAY')
--------- ------------------------------------
06-JAN-12 FRIDAY
13-JAN-12 FRIDAY
20-JAN-12 FRIDAY
27-JAN-12 FRIDAY
03-FEB-12 FRIDAY
10-FEB-12 FRIDAY
17-FEB-12 FRIDAY
24-FEB-12 FRIDAY
02-MAR-12 FRIDAY
09-MAR-12 FRIDAY
16-MAR-12 FRIDAY
23-MAR-12 FRIDAY
30-MAR-12 FRIDAY
13 rows selected.
@mathguyがnext_day()
は、NLSに敏感ですが、2番目の引数に式を使用することができ、コメントで指摘したように、その代わりに、あなたがこれを行うことができ日間の名をハードコーディングの:
next_day(date '2012-01-01' - 1, to_char(date '1999-12-31', 'FMDAY'))
1999- 12-31は、金曜日であることが知られている任意の日付にすることができます。 selectリストとconnect-by節の式が異なっていても構いません(実際にはあなたと私は違うはずです):
SELECT dates, to_char(dates, 'FMDAY', 'NLS_DATE_LANGUAGE=ENGLISH')
FROM (
SELECT next_day(date '2012-01-01' - 1,
to_char(date '1999-12-31', 'FMDAY')) + (7 * (level - 1)) AS dates
FROM dual
CONNECT BY level <= 1 + (date '2012-03-31' - next_day(date '2012-01-01' - 1,
to_char(date '1999-12-31', 'FMDAY')))/7
);
これは、セッションの日付言語に関係なく、上記と同じ13行を取得します。出力をセッション言語にしたい場合は、オーバーライドする第3引数をto_char()
に削除してください。
[ask] – OldProgrammer
あなたの質問/問題/エラーは何ですか?あなたが示したものは、日付文字列の周りに一重引用符を必要としますが、とにかく...とにかく複雑に思えますが、アドレステーブルには何が関係していますか? –
Thanq u非常に、一重引用符を忘れていました。これはうまくいきました。 –