web-dev-qa-db-ja.com

Oracleのデフォルトの日付形式はYYYY-MM-DD、なぜですか?

Oracleのデフォルトの日付形式はYYYY-MM-DDです。つまり、私がそうするなら:

 select some_date from some_table

... I 失う日付の時間部分。

はい、私はあなたがこれを「修正」できることを知っています:

 alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

しかし、真剣に、なぜは上記のデフォルトではないのですか?特に、2つの主要な時間追跡データ型(DATEおよびTIMESTAMP)bothに、(少なくとも)1秒までの精度を含む時間コンポーネントがあるDBMSで。

67
Aaron Fi

このクエリを使用してデータウェアハウスの入力ファイルを生成する場合は、データを適切にフォーマットする必要があります。基本的にその場合、日付(時刻コンポーネントを含む)を文字列に変換しています。文字列を明示的にフォーマットするか、nls_date_formatを変更してデフォルトを設定する必要があります。クエリでは次のことができます。

select to_char(some_date, 'yyyy-mm-dd hh24:mi:ss') my_date
  from some_table;
53
Doug Porter

OracleデータベースとOracle SQL Developerを混同していないのですか?

データベース自体には日付形式はなく、日付はデータベースから生の形式で取得されます。レンダリングするのはクライアントソフトウェア次第であり、SQL Developer does YYYY-MM-DDをデフォルトの形式として使用しますが、これはほとんど役に立ちません。

編集:以下でコメントしたように、SQL DeveloperはDATE値を適切に表示するように再構成できますが、デフォルトが不適切です。

81
skaffman

YYYY-MM-DDの形式は ISO8601 の一部であり、日付(および時刻)情報の交換の標準です。

このようなISO標準を採用するのはOracleにとって非常に勇敢ですが、同時に奇妙な最後まで行きます

一般に、人々は異なるものに抵抗しますが、多くの 良い国際的な理由 があります。

革新的なことを言っていることは知っていますが、一度に少しずつISO標準を採用する必要があります

21
pavium

Oracleの最大のPITAは、デフォルトの日付形式がないことです!

Oracleのインストールでは、ロケールとインストールオプションの組み合わせが、日付を出力するための形式として(非常に賢明です!)YYYY-MM-DDを選択しています。別のインストールでは、「DD/MM/YYYY」または「YYYY/DD/MM」を選択できます。

SQLを別のOracleサイトに移植したい場合は、以下をお勧めします。 常に SQLの各日付列をTO_CHAR(datecol,'YYYY-MM-DD')または同様の関数でラップするか、接続した直後に代替フォーマットを交互に設定します

ALTER SESSION 
SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS'; 

または類似。

12
James Anderson

日付形式、通貨形式、オプティマイザーモードなど、特定の値(IMHO)に設定されている既定値に依存することは賢明ではありません。サーバー、クライアント、またはアプリケーションで、必要な日付形式の値を常に設定する必要があります。

特に、日付や数値のデータ型を表示目的で変換するときは、デフォルトに依存しないでください。データベースを1回変更するだけでアプリケーションが破損する可能性があるためです。常に明示的な変換形式を使用してください。何年もの間、デフォルトの日付表​​示フォーマットがMM/DD/RRであるOracleシステムで働いていました。

9
David Aldridge

IDEのほとんどは、日付、通貨、小数点記号など、ある種のデータのデフォルトマスクを設定できます。

Oracle SQL Developerを使用している場合:

ツール>設定>データベース> NLS

日付形式:YYYY-MM-DD HH24:MI:SS

7
Fabio Farath

これはクライアント側の「問題」であり、実際にはOracleの問題ではありません。

この方法で日付をフォーマットして表示するのは、クライアントアプリケーションです。

あなたの場合、このフォーマットを行うのはSQL * Plusです。
他のSQLクライアントには他のデフォルトがあります。

標準SQLのDATE値はYYYY-MM-DDです。したがって、Oracleは時間情報を保存しますが、SQL標準と互換性のある方法で値を表示しているのではないかと思います。標準には、日付と時刻の情報を含むTIMESTAMPデータ型があります。

4
Harold L

私はOracleユーザーではありません(まあ、とにかく最近)、しかし...

ほとんどのデータベース(および正確な言語)では、日付に時刻は含まれません。日付があるということは、その日付に特定の秒を示していることを意味するものではありません。通常、日付だけでなく時刻も必要な場合は、タイムスタンプと呼ばれます。

2
Nick Bastin

Oracleには、日付とタイムスタンプの両方のデータ型があります。

Oracle documentation によると、日付とタイムスタンプにはデータサイズに違いがあるため、日付のみのフィールドを使用する場合は、日付の書式を表示するのが理にかなっています。また、「秒の小数部やタイムゾーンはありません。」 -したがって、タイムスタンプ情報が必要な場合、これは最良の選択ではありません。

日付フィールドは、Oracle SQL Developerで時間コンポーネントを表示するように簡単にフォーマットできます。 PL/SQL Developerで実行された日付クエリは時間を表示しますが、Oracle SQL Developerでは表示されません 。ただし、秒の小数部やタイムゾーンは表示されません。このためには、タイムスタンプデータ型が必要です。

1
razvanone

理由:タイムスタンプ付きのデータの列を見ている場合、_MOST_IMPORTANT_ビットの情報は年です。データベースに10年間データが保存されている場合は、知っておくことが重要です。年が最初です.

月が次に来て、それから日、時間、分になるというのは理にかなっています。客観的には、これらは時間データを表示するための最も論理的なシーケンスです。

また、デフォルトでデータを表示する場合は、データの最も重要な部分のみを表示する必要があるため、デフォルトではY-M-Dのみを表示する必要があります。それ以外はすべて表示できますが、デフォルトではSQLレポートが乱雑になることはありません。

Y-M-Dを表示する場合、日付による順序付けは論理的なものです。コンピューターはシーケンシャルが得意で、論理的に見えます。

最後に。 M-D-Yを望むあなたのバイアスはあなたのバイアスです。米国の誰もがこの形式を使用しているわけではありません。したがって、最も論理的な形式を使用し、他の人がデフォルトで論理的であると決めたときに怒りを感じないでください。

(私は米国生まれであり、オラクルを代表していません。しかし、私は自分で考えることができます)

1
hollington