2016-07-28 2 views
1

は、Oracle 11/12でこのコードを実行:時間入力のみのOracle TO_DATEは、どのロジックに基づいて日付コンポーネントを追加しますか?

select to_date('101200', 'hh24miss') from dual 

は、Oracleが自動的にどのようなロジックに基づいて追加DATEコンポーネントを返しますか?

例:私たちは、追加の日付コンポーネントは常に現在の月の最初の日に設定されている参照

select to_char(to_date('101200', 'hh24miss'), 'yyyymmdd') from dual 

戻り

20160701 

。この論理はどこから来ていますか?

ありがとうございます。

+0

'date'データ型の値には常に日付と時刻の要素が含まれています。日時値の時間部分のみを指定した場合、日付部分のデフォルトは現在の月の最初の日になります。 –

+0

おそらく、関数のデフォルトの動作がどのように実装されているのでしょうか。あなたがその行動を変えることができるかどうかを尋ねるなら、私はそうは思わない。 – OldProgrammer

+1

質問は私には明らかですが、他の多くの「なぜOracleはこのようにしましたか」という質問を入力すると、満足のいく回答になることはまずありません。彼らはデフォルト値を選択しなければなりませんでした。私は毎月変わらないものを選びましたが、私はオラクルではありません。少なくとも9i以来、私たちは 'INTERVAL'を持っています。 – Bacs

答えて

2

日付データ型の値には常に日付と時刻のコンポーネントが含まれています。日時値の時間部分のみを指定した場合、日付部分のデフォルトは現在の月の最初の日になります。

Here is one of the places (7th paragraph)この動作が文書化されているOracleのマニュアル。

もリテラルTIMEが文書化されていませんし、使用して時間だけを格納する必要がある場合TIMEデータ型は、日付の部分なしで、(10407(日時TIMEデータ型の作成)イベントを経由して有効にする必要があります)。

ここでは、timeリテラルとtimeデータ型を使用した小さなデモンストレーションがあります。しかし、再びそれは文書化されておらず、サポートされていない機能です。

SQL> select time '11:32:00' as res 
    2 from dual; 

res 
------------------------ 
11.32.00.000000000 AM  

あなたは10407イベントを有効にせずにリテラルの時間を使うことができますが、10407イベントを有効にする必要がありtimeデータ型の列を定義することができるようにするために:

SQL> create table time_table(time_col time); 
create table time_table(time_col time) 
           * 
ERROR at line 1: 
ORA-00902: invalid datatype 

-- enable 10407 event 
SQL> alter session set events '10407 trace name context forever, level 1'; 

Session altered. 

を今私たちが作成することができますtimeのデータ型を持つ表:

SQL> create table time_table(time_col time); 

Table created. 


SQL> insert into time_table(time_col) 
    2 values(time '11:34:00'); 

1 row created. 

SQL> select * from time_table; 

TIME_COL 
--------------- 
11.34.00 AM 

SQL> alter session set events '10407 trace name context off'; 

Session altered. 
+0

TIMEのリテラル機能は、ドキュメント化されていないサポートされていないTIMEリテラル機能は、特にTO_DATEについてのこの質問にはあまり関係ありません。 –

+0

私はまだそれを受け入れるでしょう。質問には回答があり、面白い情報が追加されました。 – grog

関連する問題