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.