web-dev-qa-db-fra.com

Comment convertir "1985-02-07T00: 00: 00.000Z" (ISO8601) en une valeur de date dans Oracle?

J'ai essayé de convertir un horodatage ("1985-02-07T00: 00: 00.000Z") en une date et j'ai échoué dans mes différentes tentatives.

Voici la requête que j'ai essayée:

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

Vos suggestions sont grandement appréciées.

30
Abilash

to_date convertit l'entrée en un type DATE qui ne prend pas en charge les fractions de seconde. Pour utiliser des fractions de seconde, vous devez utiliser un type TIMESTAMP qui est créé lors de l'utilisation de to_timestamp

commentaire de pst sur le ff3 le modificateur est également correct.

Les valeurs "constantes" dans le masque de format doivent être mises entre guillemets

Donc, la déclaration finale est:

select to_timestamp('1985-02-07T00:00:00.000Z', 'YYYY-MM-DD"T"HH24:MI:SS.ff3"Z"')
from dual;
48
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.
10
Rob van Wijk

Quelques règles à suivre :

  1. Les littéraux doivent être entre guillemets: MM attend un numéro de mois, "MM" Attend un double-M.
  2. Le format des secondes fractionnaires est FF, pas F ou FFF. Vous spécifiez le nombre de chiffres avec un entier de fin, par exemple FF3.
  3. Mais les dates ne peuvent pas contenir de fraction de seconde de toute façon, vous ne pouvez donc pas utiliser FF3 Dans ce contexte.

Cela marche:

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

Je ne sais pas s'il existe un moyen d'ignorer les fractions de secondes dans TO_DATE() j'ai donc utilisé des fonctions de manipulation de chaînes pour les supprimer:

SELECT TO_DATE(SUBSTR('1985-02-07T00:00:00.000Z', 1, 19), 'YYYY-MM-DD"T"HH24:MI:SS')
FROM dual;
2
Álvaro González

si vous voulez obtenir la chaîne au format datetime, essayez ceci ....

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

seulement pour la date, utilisez simplement ...

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