Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Firebird 4 - получить timezone сессии? / 25 сообщений из 44, страница 1 из 2
10.06.2019, 19:00
    #39825090
alex deeep
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 4 - получить timezone сессии?
Как на сервере FB4 определить из какой временной зоны работает пользователь? Можно как-то в event CONNECT или TRANSACTION START определить таймзону или хотя бы время пользователя? Или только вариант после подключения в контекст сессии записать то, что прислал клиент? В нэймспейсах ничего нового в этом направлении нет.
И если клиент делает set time zone 'America/Sao_Paulo'; как на сервере определить, что клиент сменил таймзону?
...
Рейтинг: 0 / 0
10.06.2019, 20:02
    #39825107
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 4 - получить timezone сессии?
А зачем ? В чём задача состоит ?
...
Рейтинг: 0 / 0
11.06.2019, 11:35
    #39825256
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 4 - получить timezone сессии?
alex deeep, по моему, от этого абсолютно никакого профита, так как пользователь может поменять часовой пояс вручную или ОС пользователя может автоматически изменить часовой пояс при смене пользователем геолокации, либо при смене IP адреса ОС решит, что пользователь сменил геолокацию, если геолокация пользователя включена только по IP. Море факторов!

Ты не можешь контролировать ни правильность часового пояса, ни правильность локального времени. Тогда как на своём сервере, время которого синхронизировано, например, с "Государственным первичным эталоном времени РФ" через NTP серверы ВНИИ ФТРИ или через NTP сервер с синхронизацией по ГЛОНАСС и прописав в триггерах до обновления назначение текущего времени для интересующих тебя полей, ты будешь иметь в этих полях непротиворечивое время.
...
Рейтинг: 0 / 0
11.06.2019, 16:27
    #39825479
alex deeep
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 4 - получить timezone сессии?
В целом пока интересуюсь этим вопросом только в связи с задачей журналирования операций пользователей. Сейчас в каждой таймзоне у нас свой сервер и журнал операций заполняется значениями с localtime. С переходом на fb4 появляется возможность собрать все региональные базы в одну, и показалось заманчивым иметь возможность журналировать операции не только по времени сервера, но и по времени клиента. А то придется принимать во внимание и вычислять для отображения, что новосибиские заказы последний раз редактировались пользователем из Новосибирска не в 5:00 (МСК), а в 9:00 (НВС).
...
Рейтинг: 0 / 0
11.06.2019, 16:39
    #39825485
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 4 - получить timezone сессии?
alex deeep,

ну так в самом таймстампе будет стоять таймзона того сервера, где выполнялся current_time\current_datetime
...
Рейтинг: 0 / 0
11.06.2019, 16:45
    #39825486
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 4 - получить timezone сессии?
alex deeepА то придется принимать во внимание и вычислять для отображения, что новосибиские заказы последний раз редактировались пользователем из Новосибирска не в 5:00 (МСК), а в 9:00 (НВС).5 утра по Москве и 9 дня по Новосибирску, это тоже самое время, которое будет хранится на сервере по UTC, а на клиенте оно уже будет приведено к локальному времени клиента с учётом часового пояса.
...
Рейтинг: 0 / 0
11.06.2019, 16:49
    #39825488
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 4 - получить timezone сессии?
hvladalex deeep,
ну так в самом таймстампе будет стоять таймзона того сервера, где выполнялся current_time\current_datetimeРазве таймзона хранится вместе со штампом времени? Я в полной уверенности, что таймзона используется сервером только для вычисления штампа времени по UTC и клиентом для приведения полученного от сервера штампа времени к времени таймозны клиента.
...
Рейтинг: 0 / 0
11.06.2019, 16:55
    #39825493
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 4 - получить timezone сессии?
rdb_devhvladalex deeep,
ну так в самом таймстампе будет стоять таймзона того сервера, где выполнялся current_time\current_datetimeРазве таймзона хранится вместе со штампом времени? Я в полной уверенности, что таймзона используется сервером только для вычисления штампа времени по UTC и клиентом для приведения полученного от сервера штампа времени к времени таймозны клиента.Ми пардон! Я заблуждался.

TIME/TIMESTAMP WITH TIME ZONE has respectively the same storage of TIME/TIMESTAMP WITHOUT TIME ZONE plus 2 bytes for the time zone identifier or displacement.

The time/timestamp parts are stored in UTC (translated from the informed time zone).

Time zone identifiers (from regions) are put directly in the time_zone field. They start from 65535 (which is the GMT code) and are decreasing as new time zones were/are added.

Time zone displacements (+/- HH:MM) are encoded with `(sign * (HH * 60 + MM)) + 1439`. For example, a `00:00` displacement is encoded as `(1 * (0 * 60 + 0)) + 1439 = 1439` and `-02:00` as `(-1 * (2 * 60 + 0)) + 1439 = 1319`.
...
Рейтинг: 0 / 0
11.06.2019, 17:05
    #39825503
alex deeep
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 4 - получить timezone сессии?
hvladalex deeep,

ну так в самом таймстампе будет стоять таймзона того сервера, где выполнялся current_time\current_datetime
Так сервер же будет один для всех регионов. Поэтому current_time для триггеров/процедур будет всегда московский (в моем случае).
...
Рейтинг: 0 / 0
11.06.2019, 17:09
    #39825508
alex deeep
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 4 - получить timezone сессии?
rdb_dev5 утра по Москве и 9 дня по Новосибирску, это тоже самое время, которое будет хранится на сервере по UTC, а на клиенте оно уже будет приведено к локальному времени клиента с учётом часового пояса.
Пользователи центрального офиса имеют доступ ко всем региональным заказам и им важно понимать, когда кто менял заказ по локальному времени региона, а не по времени центрального офиса. Это значит нужно приводить время к нужному часовому поясу по информации о пользователе.
...
Рейтинг: 0 / 0
11.06.2019, 17:13
    #39825509
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 4 - получить timezone сессии?
alex deeepТак сервер же будет один для всех регионов. Поэтому current_time для триггеров/процедур
будет всегда московский (в моем случае).

Только если это коннект через терминальный сервер. При нормальном коннекте с нормального
клиента там будет часовой пояс клиента насколько я в курсе.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
11.06.2019, 17:22
    #39825514
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 4 - получить timezone сессии?
alex deeephvladalex deeep,

ну так в самом таймстампе будет стоять таймзона того сервера, где выполнялся current_time\current_datetime
Так сервер же будет один для всех регионов. Поэтому current_time для триггеров/процедур будет всегда московский (в моем случае).

Зависит от приложения
doc\sql.extensions\README.time_zone.mdSET TIME ZONE statement
Changes the session time zone.

Syntax
SET TIME ZONE { <time zone string> | LOCAL }
...
Рейтинг: 0 / 0
11.06.2019, 17:26
    #39825517
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 4 - получить timezone сессии?
Dimitry SibiryakovПри нормальном коннекте с нормального
клиента там будет часовой пояс клиента насколько я в курсе.Я не вижу, чтобы этот тег вставлялся fbclient'ом самостоятельно
...
Рейтинг: 0 / 0
11.06.2019, 17:30
    #39825518
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 4 - получить timezone сессии?
hvladЯ не вижу, чтобы этот тег вставлялся fbclient'ом самостоятельно

Действительно. Хотя по идее должен бы. И вроде бы это даже обсуждалось в девеле.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
11.06.2019, 17:49
    #39825529
alex deeep
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 4 - получить timezone сессии?
Ага, прочитал внимательно еще раз
In version 4.0, CURRENT_TIME and CURRENT_TIMESTAMP now return TIME WITH TIME ZONE and
TIMESTAMP WITH TIME ZONE, with the time zone set by the session time zone
Теперь еще тучу процедур и триггеров пересматривать, которые ориентированы на то, что CURRENT_TIMESTAMP returns the current server date and time.

А где теперь, простите, серверное время?
...
Рейтинг: 0 / 0
11.06.2019, 17:49
    #39825530
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 4 - получить timezone сессии?
alex deeeprdb_dev5 утра по Москве и 9 дня по Новосибирску, это тоже самое время, которое будет хранится на сервере по UTC, а на клиенте оно уже будет приведено к локальному времени клиента с учётом часового пояса.
Пользователи центрального офиса имеют доступ ко всем региональным заказам и им важно понимать, когда кто менял заказ по локальному времени региона, а не по времени центрального офиса. Это значит нужно приводить время к нужному часовому поясу по информации о пользователе.Попробуй это:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
EXECUTE BLOCK
RETURNS
(
  ret TIMESTAMP WITH TIME ZONE,
  disp_hour SMALLINT,
  disp_minute SMALLINT
)
AS
  DECLARE VARIABLE tmstmp_notz TIMESTAMP WITHOUT TIME ZONE;
BEGIN
  tmstmp_notz = CURRENT_TIMESTAMP AT TIME ZONE 'Asia/Krasnoyarsk';
  ret = tmstmp_notz;
  disp_hour = Extract(TIMEZONE_HOUR FROM ret);
  disp_minute = Extract(TIMEZONE_MINUTE FROM ret);
  SUSPEND;
  ret = tmstmp_notz AT TIME ZONE 'UTC';
  disp_hour = Extract(TIMEZONE_HOUR FROM ret);
  disp_minute = Extract(TIMEZONE_MINUTE FROM ret);
  SUSPEND;
  ret = tmstmp_notz AT TIME ZONE 'Asia/Krasnoyarsk';
  disp_hour = Extract(TIMEZONE_HOUR FROM ret);
  disp_minute = Extract(TIMEZONE_MINUTE FROM ret);
  SUSPEND;
  ret = tmstmp_notz AT TIME ZONE 'Europe/Moscow';
  disp_hour = Extract(TIMEZONE_HOUR FROM ret);
  disp_minute = Extract(TIMEZONE_MINUTE FROM ret);
  SUSPEND;
  ret = tmstmp_notz AT LOCAL;
  disp_hour = Extract(TIMEZONE_HOUR FROM ret);
  disp_minute = Extract(TIMEZONE_MINUTE FROM ret);
  SUSPEND;
END
...
Рейтинг: 0 / 0
11.06.2019, 19:40
    #39825587
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 4 - получить timezone сессии?
alex deeepА где теперь, простите, серверное время?LOCALTIME
...
Рейтинг: 0 / 0
11.06.2019, 21:50
    #39825609
alex deeep
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 4 - получить timezone сессии?
hvladalex deeepА где теперь, простите, серверное время?LOCALTIME
А вот и нет...

C:\Program Files\Firebird\Firebird_4_0>isql
Use CONNECT or CREATE DATABASE to specify a database
SQL> connect e:\test\test.fdb user SYSDBA password masterkey;
Database: e:\test\test.fdb, User: SYSDBA
SQL> SELECT localtime, current_time FROM RDB$DATABASE;

LOCALTIME CURRENT_TIME
============= ==============================================
21:44:47.0000 21:44:47.0000 Europe/Moscow

SQL> set time zone 'Asia/Novosibirsk';
SQL> SELECT localtime, current_time FROM RDB$DATABASE;

LOCALTIME CURRENT_TIME
============= ==============================================
01:45:15.0000 01:45:15.0000 Asia/Novosibirsk
...
Рейтинг: 0 / 0
11.06.2019, 22:38
    #39825615
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 4 - получить timezone сессии?
Да, так не получится.
А вот через гланды - всё же можно.

Сначала

Код: sql
1.
2.
select RDB$SET_CONTEXT('USER_SESSION', 'TZ', extract(TIMEZONE_HOUR from current_time)) 
  from rdb$database;



Далее
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
create or alter function fn_localTime
  returns time
as
begin
  execute statement ('set time zone ''' || RDB$GET_CONTEXT('USER_SESSION', 'TZ') || '''');
  return localtime;
  set time zone local;
end



Ну и проверка
Код: sql
1.
2.
3.
4.
select fn_localTime(), localTime from rdb$database;

set time zone 'UTC';
select fn_localTime(), localTime from rdb$database;
...
Рейтинг: 0 / 0
11.06.2019, 22:39
    #39825616
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 4 - получить timezone сессии?
С другой стороны - а зачем ?
Задавай правила на сервере с использованием 'Asia/Novosibirsk' (если так хочется) - и всё
...
Рейтинг: 0 / 0
13.06.2019, 15:07
    #39826183
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 4 - получить timezone сессии?
Чуточку офтопну в этом топике, иначе у меня "новая тема" опять в "Пятницу" улетит.

Наткнулся со штампами времени на несколько довольно странных, э-э-э... Багов? Не очень понимаю, с чем это может быть связано.

1. Приведения строки '0001-01-01 00:00:00.100 UTC' с часовым поясом к TIMESTAMP WITH TIME ZONE валит ошибку 'expression evaluation not supported. value exceeds the range for valid timestamps.'
Не работает:
Код: plsql
1.
2.
SELECT Cast('0001-01-01 00:00:00.100 UTC' AS TIMESTAMP WITH TIME ZONE) AT TIME ZONE 'Europe/Moscow'
  FROM oneRow


Работает (выдаёт значение 97 !):
Код: plsql
1.
2.
3.
4.
SELECT Extract(HOUR FROM Cast(
      '0001-01-01 00:00:00.100 UTC' AS TIMESTAMP WITH TIME ZONE
    ) AT TIME ZONE 'Europe/Moscow')
  FROM oneRow


Работает:
Код: plsql
1.
SELECT Cast('0001-01-01 00:00:00.100' AS TIMESTAMP WITHOUT TIME ZONE) FROM oneRow



2. Слишком большие различия при расчёте в DATEDIFF через дни и через миллисекунды.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
EXECUTE BLOCK
  RETURNS
  (
    dayz_chk BIGINT,
    dayz DOUBLE PRECISION,
    ahead_chk TIMESTAMP WITHOUT TIME ZONE,
    back_chk TIMESTAMP WITHOUT TIME ZONE
  )
AS
  DECLARE VARIABLE ts TIMESTAMP WITHOUT TIME ZONE;
BEGIN
  ts = Cast('Now' AS TIMESTAMP WITHOUT TIME ZONE);
  dayz_chk = DATEDIFF(DAY
      FROM Cast('0001-01-01 00:00:00.100' AS TIMESTAMP WITHOUT TIME ZONE)
      TO ts);
  dayz = Cast(DATEDIFF(MILLISECOND
      FROM Cast('0001-01-01 00:00:00.100' AS TIMESTAMP WITHOUT TIME ZONE)
      TO ts AT TIME ZONE 'UTC') AS DOUBLE PRECISION) / 86400000;
  ahead_chk = '0001-01-01 00:00:00.100';
  ahead_chk = ahead_chk + dayz;
  back_chk = ts - dayz;
  SUSPEND;
END
...
Рейтинг: 0 / 0
13.06.2019, 15:34
    #39826199
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 4 - получить timezone сессии?
rdb_dev,

где в это время была Москва? Что тебе даст аналогичный эксперимент например в Яве?
...
Рейтинг: 0 / 0
13.06.2019, 15:36
    #39826200
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 4 - получить timezone сессии?
Хотя, если в строке:
Код: plsql
1.
2.
3.
  dayz = Cast(DATEDIFF(MILLISECOND
      FROM Cast('0001-01-01 00:00:00.100' AS TIMESTAMP WITHOUT TIME ZONE)
      TO ts AT TIME ZONE 'UTC') AS DOUBLE PRECISION) / 86400000;

у 'ts' убрать AT TIME ZONE 'UTC', несоответствие уходит.
...
Рейтинг: 0 / 0
13.06.2019, 15:38
    #39826202
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 4 - получить timezone сессии?
Симонов Денисrdb_dev,

где в это время была Москва? Что тебе даст аналогичный эксперимент например в Яве?Какая разница, где была Москва, если 'Europe/Moscow', это, всего лишь, идентификатор часового пояса UTC+3? Или в Рождество Христово планета Земля на время остановила своё вращение?
...
Рейтинг: 0 / 0
13.06.2019, 15:43
    #39826204
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 4 - получить timezone сессии?
rdb_dev,

в это время вообще часовых поясов не существовало если что. В базе часовых поясов у любой тайм-зоны есть дата начала и дата окончания для смещения. Возьми и выведи все существующие смещения для Europe/Moscow может тогда поймёшь откуда такая фигня вылезла.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Firebird 4 - получить timezone сессии? / 25 сообщений из 44, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]