Daty Oracle nie zawierają informacji o strefie czasowej. Zamiast tego należy użyć typu danych TIMESTAMP.
To działa mniej więcej tak:
SQL> desc tz
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER
TS TIMESTAMP(6) WITH TIME ZONE
TNOW TIMESTAMP(6) WITH TIME ZONE
SQL> insert into tz
2 values (1
3 , to_timestamp_tz('2002-10-10 12:00:00-05:00'
4 , 'YYYY-MM-DD HH24:MI:SSTZH:TZM')
5 , systimestamp)
6/
1 row created.
SQL> select * from tz
2/
ID
----------
TS
---------------------------------------------------------------------------
TNOW
---------------------------------------------------------------------------
1
10-OCT-02 12.00.00.000000 -05:00
23-AUG-10 17.37.06.502000 +01:00
SQL>
Uwaga, nie jest trudne zagadnienie T w notacji XSD. To rzuca wyjątek ORA-01858
, ponieważ nie jest to poprawny format w Oracle. Jestem pewna, że istnieje obejście, ale obecnie ucieka mi.
Cóż, jednym z rozwiązań jest zastosowanie funkcji SUBSTR() sto podział otworzyć dwie części znacznika czasu, jak Bob pokazuje. Ale powinien istnieć bardziej elegancki sposób.
To prawdopodobnie nie kwalifikuje się jako „elegancki”, ale jako, że jest to ciąg możemy użyć funkcji podstawiania się pozbyć uciążliwego T:
SQL> insert into tz
2 values (2
3 , to_timestamp_tz(translate('2003-10-10T12:00:00-05:00', 'T', ' ')
4 , 'YYYY-MM-DD HH24:MI:SSTZH:TZM')
5 , systimestamp)
6/
1 row created.
SQL> select * from tz
2/
ID
----------
TS
---------------------------------------------------------------------------
TNOW
---------------------------------------------------------------------------
1
10-OCT-02 12.00.00.000000 -05:00
23-AUG-10 17.37.06.502000 +01:00
2
10-OCT-03 12.00.00.000000 -05:00
23-AUG-10 17.53.37.113000 +01:00
SQL>
Ale biorąc pod uwagę cały wysiłek Oracle mają wprowadzone do XMLDB jest dość denerwujące, że nie ma bardziej przejrzystego rozwiązania.
"Nie rozumiem, jak można dostać -05. 00"
W mojej oryginalnej próbce używam maski formatu 'YYYY-MM-DD HH24:MI:SS-TZH:TZM'
. To interpretuje -
w strefie czasowej jako separator, a nie znak minus. W rezultacie powrócił +05: 00. Od tego czasu poprawiłem próbkę kodu, aby usunąć ostatni kresk. Teraz strefa czasowa jest poprawnie wyświetlana jako -05: 00. Przepraszamy za jakiekolwiek zamieszanie.
@ user412045: Twoje pytanie nie jest jasne. Czy chcesz przekonwertować to '2002-10-10T12: 00: 00-05: 00' na to' 20021010'? Co masz na myśli przez "przechowywanie informacji o strefie czasowej"? –
Chcę konwertować 2002-10-10T12: 00: 00-05: 00 na datę Oracle. 20021010 był tylko przykładem. Przechowując informacje o strefie czasowej mam na myśli to, że chcę mieć możliwość pobrania pełnej daty. Dzięki – MoreCoffee