4

デスクトップで次のクエリを実行すると

Select to_char(join_date, 'DD-MON-YYYY')
From students
group by to_char(join_date, 'DD-MON-YYYY');

次の出力が得られます。

23-Oct-2012
25-Oct-2012
23-Oct-2012
23-Oct-2012
23-Oct-2012
26-Oct-2012
23-Oct-2012
24-Oct-2012
23-Oct-2012

しかし、別のサーバーで実行すると、出力は次のようになります。

23-Oct. -2012
25-Oct. -2012
23-Oct. -2012
23-Oct. -2012
23-Oct. -2012
26-Oct. -2012
23-Oct. -2012
24-Oct. -2012
23-Oct. -2012

これを引き起こしている可能性のあるアイデアはありますか?2 番目のサーバーは私とは別の国で実行されているため、地域設定が異なる可能性があります。

アップデート:

NLS_DATE_FORMAT は、両方のサーバーで DD-Mon-RRRR です。

4

3 に答える 3

1

danihp が示唆するように、違いはおそらくNLS_LANGUAGE設定にかかっており、これはおそらくより高い NLS パラメータから派生したものです。グローバリゼーション サポート ガイドで説明されているように、これをオーバーライドして一貫した結果を得ることができます (必ずしも良い考えではありません) 。これらのクエリを実行すると、2 つのサーバーで一貫した結果が得られるはずです (表示されたデータから、そのうちの 1 つがフランス語であると推測されます)。

select to_char(join_date, 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE=FRENCH')
from students ...;

select to_char(join_date, 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE=ENGLISH')
from students ...;

混乱の根底にあるのは、おそらくあなたがMON表現しようとしているものです。SQL リファレンスに記載されているように、MONは「月の省略名」です。つまり、必ずしも 3 文字の省略形であるとは限りません。完全な月名の省略形は、NLS の設定によって異なります。

英語では、すべての月の名前を明確に 3 文字に短縮できます。

select level as l,
    to_char(to_date(level, 'MM'), 'Month', 'NLS_DATE_LANGUAGE=ENGLISH'),
    to_char(to_date(level, 'MM'), 'Mon', 'NLS_DATE_LANGUAGE=ENGLISH')
from dual
connect by level <= 12
order by 1

         L TO_CHAR(TO_DATE(LEVEL,'MM'),'MONTH', TO_CHAR(TO_D
---------- ------------------------------------ ------------
         1 January                              Jan
         2 February                             Feb
         3 March                                Mar
         4 April                                Apr
         5 May                                  May
         6 June                                 Jun
         7 July                                 Jul
         8 August                               Aug
         9 September                            Sep
        10 October                              Oct
        11 November                             Nov
        12 December                             Dec

フランス語ではそうではありません:

select level as l,
    to_char(to_date(level, 'MM'), 'Month', 'NLS_DATE_LANGUAGE=FRENCH'),
    to_char(to_date(level, 'MM'), 'Mon', 'NLS_DATE_LANGUAGE=FRENCH')
from dual
connect by level <= 12
order by 1;

         L TO_CHAR(TO_DATE(LEVEL,'MM'),'MONTH', TO_CHAR(TO_DATE(LEVE
---------- ------------------------------------ --------------------
         1 Janvier                              Janv.
         2 Février                              Févr.
         3 Mars                                 Mars
         4 Avril                                Avr.
         5 Mai                                  Mai
         6 Juin                                 Juin
         7 Juillet                              Juil.
         8 Août                                 Ao
         9 Septembre                            Sept.
        10 Octobre                              Oct.
        11 Novembre                             Nov.
        12 Décembre                             Déc.

明らかに、3 文字の略語を使用すると、Juin と Juillet にとって困難が生じます。おそらく、略語をピリオドで表すことは文化的なものであり、月によっては 4 文字を区別する必要があるため、MONフォーマットの長さが最大 ​​5 文字になります。

書式モデルがそれを固定幅として保持することは少し驚くかもしれません。そのため、元のデータのように、短い略語のために中央にスペースがあります。どちらの方法でも議論できると確信しており、一貫して適用されているようです. それを自動的に停止する方法を知りません。

于 2012-10-30T23:00:09.993 に答える
1

コードを次のようにタイプミスしていませんでした:

select to_char(join_date,'dd-mon.-yyyy') from students;

結果は次のようになります。

23-Oct.-2012
于 2012-10-29T23:06:25.503 に答える
1

オラクルがデータベースから日付フィールドを取得して表示すると、暗黙的なキャスト変換が行われます。この変換のフォーマット パターンは、Oracle 構成で設定されます。オラクルのドキュメントを引用

Oracle 日付値のデフォルトの日付形式は、NLS_DATE_FORMAT および NLS_DATE_LANGUAGE 初期化パラメータから導出されます。

両方のサーバーで NLS_DATE_FORMAT が DD-Mon-RRRR の場合は、 NLS_DATE_LANGUAGE を確認してください。

于 2012-10-29T19:05:36.777 に答える