Как преобразовать «1985-02-07T00: 00: 00.000Z» (ISO8601) в значение даты в Oracle? - PullRequest
29 голосов
/ 28 декабря 2011

Я пытался преобразовать метку времени ("1985-02-07T00: 00: 00.000Z") в дату, и мне не удалось выполнить несколько моих разных попыток.

Ниже приведен запрос, который я пробовал:

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

Ваши предложения очень ценятся.

Ответы [ 5 ]

46 голосов
/ 28 декабря 2011

to_date преобразует ввод в тип DATE, который не поддерживает доли секунды.Чтобы использовать доли секунды, вам нужно использовать тип TIMESTAMP, который создается при использовании to_timestamp

. Комментарий pst о модификаторе ff3 также верен.

Значения "Constant" вмаска формата должна быть заключена в двойные кавычки

Итак, окончательное утверждение:

select to_timestamp('1985-02-07T00:00:00.000Z', 'YYYY-MM-DD"T"HH24:MI:SS.ff3"Z"')
from dual;
10 голосов
/ 28 декабря 2011
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.
3 голосов
/ 17 августа 2012
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'
2 голосов
/ 28 декабря 2011

Некоторым правилам, которым нужно следовать :

  1. Литералы должны быть заключены в двойные кавычки: MM ожидает номер месяца, "MM" ожидает двойной М.
  2. Формат для доли секунды: FF, а не F или FFF.Вы указываете число цифр с конечным целым числом, например, FF3.
  3. Но даты все равно не могут содержать доли секунды, поэтому вы не можете использовать FF3 в этом контексте.

Thisработает:

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

Я не знаю, есть ли способ игнорировать дробные секунды в TO_DATE(), поэтому я использовал функции манипуляции со строками для их удаления:

SELECT TO_DATE(SUBSTR('1985-02-07T00:00:00.000Z', 1, 19), 'YYYY-MM-DD"T"HH24:MI:SS')
FROM dual;
0 голосов
/ 28 мая 2015

если вы хотите получить строку в формате даты и времени, попробуйте это ....

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

только для даты просто используйте ...

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