Comme @Gordon l'a dit, les horodatages (et les dates) ne sont pas stockés dans un format que vous reconnaîtriez qu'Oracle utilise une représentation interne que vous n'avez jamais vraiment besoin de connaître ou d'examiner (mais elle est documentée si vous êtes intéressé par ce genre de chose) .
Lorsque vous interrogez un horodatage, il s'affiche à l'aide des paramètres NLS de votre client, sauf si vous avez un client qui les remplace. Je peux configurer ma session pour qu'elle corresponde à ce que vous voyez :
alter session set nls_timestamp_format = 'DD-MON-RR HH.MI.SS.FF AM';
select to_char(systimestamp, 'YYYY-MM-DD HH24:MI:SS') from dual;
TO_CHAR(SYSTIMESTAM
-------------------
2018-07-10 15:37:31
select to_timestamp(to_char(systimestamp, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') from dual;
TO_TIMESTAMP(TO_CHAR(SYSTIMESTA
-------------------------------
10-JUL-18 03.37.31.000000000 PM
Et je peux le changer voir ce que vous voulez voir :
alter session set nls_timestamp_format = 'YYYY-MM-DD HH24:MI:SS';
select to_timestamp(to_char(systimestamp, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') from dual;
TO_TIMESTAMP(TO_CHA
-------------------
2018-07-10 15:37:32
Mais tout ce que vous faites est de convertir à partir d'un horodatage avec fuseau horaire (c'est ce que systimestamp
est) à une chaîne, puis de nouveau à un horodatage. Vous perdez la partie fuseau horaire et toutes les fractions de seconde ; ce que vous pouvez également faire avec un cast
:
select cast(systimestamp as timestamp(0)) from dual;
CAST(SYSTIMESTAMPAS
-------------------
2018-07-10 15:37:32
Vous pouvez voir le fuseau horaire et les fractions de seconde avec votre timestamp_tz
par défaut format :
select systimestamp from dual;
SYSTIMESTAMP
------------------------------------
2018-07-10 15:37:33.776469000 +01:00
et changez-le avec un alter
différent :
alter session set nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS.FF3 TZH:TZM';
select systimestamp from dual;
SYSTIMESTAMP
------------------------------
2018-07-10 15:37:34.070 +01:00
Ce qui n'est pas tout à fait pertinent si vous parlez vraiment de stocker des horodatages dans une table, mais montre qu'il existe des variations.
Dans votre tableau, faites le type de données timestamp
(ou timestamp with time zone
ou timestamp with local time zone
), et ne vous souciez que du formatage de la valeur sous forme de chaîne pour la présenter à l'utilisateur final, au dernier moment possible.
Lorsque vous avez besoin de l'afficher, si le format d'affichage est important pour vous, utilisez alors to_char()
avec un masque de format explicite - ne supposez pas que quelqu'un d'autre exécutant vos requêtes aura les mêmes paramètres NLS. Comme vous pouvez le voir, il est facile de les changer pour modifier la sortie. (La plupart des clients ont un moyen de vous laisser définir les valeurs par défaut afin que vous n'ayez pas à faire la même alter
commandes à chaque fois que vous vous connectez ; par exemple. dans SQL Developer, depuis Outils->Préférences->Base de données->NLS). Si vous voulez toujours afficher le même format, utilisez quelque chose comme :
select to_char(your_column, 'YYYY-MM-DD HH24:MI:SS') as column_alias
from your_table
where your_column < timestamp '2018-01-01 00:00:00'
qui montre également la valeur de la colonne filtrée (toujours sous forme d'horodatage) à l'aide d'un littéral d'horodatage.