Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle TO_DATE mit nur Zeiteingabe fügt basierend auf welcher Logik eine Datumskomponente hinzu?

Ein Wert vom Datentyp Datum hat immer Datums- und Zeitkomponenten. Wenn Sie wie bisher nur den Zeitteil des datetime-Werts angeben, ist der Datumsteil standardmäßig der erste Tag des aktuellen Monats.

Hier ist einer der Orte (7. Absatz) in der Oracle-Dokumentation, wo dieses Verhalten dokumentiert ist.

Es gibt auch undokumentierte TIME Literal und TIME Datentyp (muss über 10407 aktiviert werden (datetime TIME datatype creation) event), wenn Sie nur die Zeit ohne Datumsteil verwenden und speichern müssen.

Hier ist eine kleine Demonstration der Verwendung von time Literal und time Datentyp. Aber auch hier handelt es sich um eine undokumentierte und nicht unterstützte Funktion.

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

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

Sie können das Zeitliteral verwenden, ohne 10407 zu aktivieren Ereignis, sondern um eine Spalte time definieren zu können Datentyp 10407 Ereignis muss aktiviert werden:

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.

Jetzt können wir eine Tabelle mit einer Spalte time erstellen Datentyp:

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.