2 votes

Traduction transparente de l'horodatage Oracle avec les valeurs du fuseau horaire local

Pour autant que je sache, TIMESTAMP WITH LOCAL TIME ZONE Les valeurs sont transparentes traduites depuis et vers le fuseau horaire de la session de l'utilisateur. Mais mes valeurs lues depuis la la base de données ne sont pas les mêmes que celles insérées précédemment. Existe-t-il un paramètre de base de données ou de de la base de données ou de la session que je peux modifier pour résoudre ce problème ?

Voici mon cas d'essai :

select systimestamp(0) from dual;

-- SYSTIMESTAMP   15/03/2017 19:01:13 +03:00

select dbtimezone from dual;

-- DBTIMEZONE     -07:00

create table test_timestamps
(
    id number generated by default on null as identity,
    systimestamp_col timestamp(0) with local time zone default on null systimestamp,
    sysdate_col timestamp(0) with local time zone default on null sysdate,
    current_timestamp_col timestamp(0) with local time zone default on null current_timestamp(0),
    date_col timestamp(0) with local time zone
);

alter session set time_zone='0:00';

insert into test_timestamps(date_col)
values (timestamp '2017-03-15 19:02:00');

select * from test_timestamps;

-- ID                                 1
-- SYSTIMESTAMP_COL                   15/03/2017 9:02:19
-- SYSDATE_COL                        15/03/2017 12:02:18
-- CURRENT_TIMESTAMP_COL              15/03/2017 9:02:19
-- DATE_COL                           15/03/2017 12:02:00

delete from test_timestamps;

alter session set time_zone='+3:00';

insert into test_timestamps(date_col)
values (timestamp '2017-03-15 19:05:00');

select * from test_timestamps;

-- ID                                 2
-- SYSTIMESTAMP_COL                   15/03/2017 12:05:43
-- SYSDATE_COL                        15/03/2017 12:05:43
-- CURRENT_TIMESTAMP_COL              15/03/2017 12:05:43
-- DATE_COL                           15/03/2017 12:05:00

Je suis particulièrement confus au sujet de la DATE_COL valeur. Pour autant que je sache, la valeur que je lis à partir de DATE_COL devrait être la même que celle que j'ai insérée, quelle que soit la session en cours. TIME_ZONE (tant qu'elle n'est pas modifiée entre mon insertion et ma sélection).

Je suis également perplexe quant à SYSTIMESTAMP valeurs par défaut.

SELECT SYSTIMESTAMP FROM DUAL renvoie toujours l'horodatage de mon serveur avec le fuseau horaire '+3:00', quel que soit le fuseau horaire de la session de l'utilisateur en cours. Mais si j'utilise SYSTIMESTAMP comme valeur par défaut pour la colonne, elle est traduite.

Ce que j'aimerais voir, c'est ça :

-- for a user in my time zone
alter session set time_zone='+3:00';

insert into test_timestamps(date_col)
values (timestamp '2017-03-15 19:15:00');

select id, systimestamp_col, date_col from test_timestamps;

-- ID                                 3
-- SYSTIMESTAMP_COL                   15/03/2017 19:15:00
-- DATE_COL                           15/03/2017 19:15:00

-- same data from a GMT user's point of view
alter session set time_zone='+0:00';

select id, systimestamp_col, date_col from test_timestamps;

-- ID                                 3
-- SYSTIMESTAMP_COL                   15/03/2017 16:15:00
-- DATE_COL                           15/03/2017 16:15:00

Est-ce possible ou est-ce que je rate quelque chose ?

UPD. Voici mon LiveSQL script . Il semble que cela devrait fonctionner comme je l'ai décrit, donc je suppose qu'il y a un problème avec la configuration de ma base de données.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X