2011-12-28 6 views
23

Próbowałem przekonwertować znacznik czasu ("1985-02-07T00: 00: 00.000Z") na datę i nie udało mi się pomyślnie wykonać kilku różnych prób.Jak przekonwertować "1985-02-07T00: 00: 00.000Z" (ISO8601) na wartość daty w Oracle?

Poniżej kwerenda Próbowałem:

select to_date('1985-02-07T00:00:00.000Z', 'YYYY-MM-DDTHH24:MI:SS.fffZ') 
from dual; 

Twoje sugestie są bardzo mile widziane.

+2

+1 za próbę rzeczy. Możesz poprawić to pytanie, włączając w to, jakie wyniki były i jak były błędne lub co ogólnie nie działało. (Czy wystąpił błąd? Czy data była kilka godzin wyłączona?) –

+2

Według [to_date] (http://www.techonthenet.com/oracle/functions/to_date.php) Wierzę, że co najmniej "fff" jest złe i powinno być "FF3". Ale nie używam/mam Oracle :) –

Odpowiedz

37

to_date konwertuje dane wejściowe na typ DATE, który nie obsługuje ułamkowych sekund. Aby użyć ułamkowych sekund, należy użyć typu TIMESTAMP, który jest tworzony, gdy używany jest również komentarz pst o modyfikatorze ff3.

"Constant" Wartości w masce formatu muszą być ujęte w cudzysłów

więc końcowy jest stwierdzenie:

select to_timestamp('1985-02-07T00:00:00.000Z', 'YYYY-MM-DD"T"HH24:MI:SS.ff3"Z"') 
from dual; 
2

Niektóre rules to follow:

  1. Literówki musi być podwójnie cytowany: MM spodziewa się numeru miesiąca, "MM" oczekuje podwójnego M.
  2. Format ułamków sekund to FF, a nie F lub FFF. Określasz liczbę cyfr z ciągiem całkowitym, np. FF3.
  3. Jednak daty nie mogą zawierać ułamkowych sekund, więc nie można użyć w tym kontekście wartości FF3.

to działa:

SELECT TO_DATE('1985-02-07T00:00:00', 'YYYY-MM-DD"T"HH24:MI:SS') 
FROM dual; 

ja nie wiem, czy istnieje sposób, aby ignorować ułamków sekund w TO_DATE() więc użyłem funkcji manipulacji ciąg rozebrać je:

SELECT TO_DATE(SUBSTR('1985-02-07T00:00:00.000Z', 1, 19), 'YYYY-MM-DD"T"HH24:MI:SS') 
FROM dual; 
8
SQL> select cast(to_timestamp('1985-02-07T00:00:00.000Z', 'yyyy-mm-dd"T"hh24:mi:ss.ff3"Z"') as date) 
    2 from dual 
    3/

CAST(TO_TIMESTAMP(' 
------------------- 
07-02-1985 00:00:00 

1 row selected. 
2
SELECT to_timestamp_tz('2012-08-08T09:06:14.000-07:00','YYYY-MM-DD"T"HH24:MI:SS.FF3TZR') 
FROM dual; 

External table DDL, 
extract_date char(29) DATE_FORMAT timestamp WITH TIMEZONE mask 'YYYY-MM-DD"T"HH24:MI:SS.FF3TZR' 
+0

fajne korzystanie z funkcji _tz. Musiałem jednak użyć tego: "YYYY-MM-DD" T "HH24: MI: SS.FF3TZHTZM" – JoshC13

0

jeśli chcesz uzyskać ciąg w formacie datetime spróbuj to ....

select to_char(TO_DATE('2012-06-26T00:00:00.809Z', 'YYYY-MM-DD"T"HH24:MI:SS".""ZZZZ"'),'yyyy-MM-dd hh:mm:ss PM') as EVENT_DATE from dual 

EVENT_DATE 
----------------------- 
2012-06-26 12:06:00 AM 

tylko dla data prostu użyć ...

select TO_DATE('2012-01-06T00:00:00.809Z', 'YYYY-MM-DD"T"HH24:MI:SS".""ZZZZ"') from dual 
Powiązane problemy