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

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

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

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

Только если это коннект через терминальный сервер. При нормальном коннекте с нормального
клиента там будет часовой пояс клиента насколько я в курсе.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Firebird 4 - получить timezone сессии?
    #39825514
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Firebird 4 - получить timezone сессии?
    #39825517
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovПри нормальном коннекте с нормального
клиента там будет часовой пояс клиента насколько я в курсе.Я не вижу, чтобы этот тег вставлялся fbclient'ом самостоятельно
...
Рейтинг: 0 / 0
Firebird 4 - получить timezone сессии?
    #39825518
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladЯ не вижу, чтобы этот тег вставлялся fbclient'ом самостоятельно

Действительно. Хотя по идее должен бы. И вроде бы это даже обсуждалось в девеле.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Firebird 4 - получить timezone сессии?
    #39825529
alex deeep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ага, прочитал внимательно еще раз
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
Firebird 4 - получить timezone сессии?
    #39825530
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Firebird 4 - получить timezone сессии?
    #39825587
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex deeepА где теперь, простите, серверное время?LOCALTIME
...
Рейтинг: 0 / 0
Firebird 4 - получить timezone сессии?
    #39825609
alex deeep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Firebird 4 - получить timezone сессии?
    #39825615
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, так не получится.
А вот через гланды - всё же можно.

Сначала

Код: 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
Firebird 4 - получить timezone сессии?
    #39825616
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С другой стороны - а зачем ?
Задавай правила на сервере с использованием 'Asia/Novosibirsk' (если так хочется) - и всё
...
Рейтинг: 0 / 0
Firebird 4 - получить timezone сессии?
    #39826183
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чуточку офтопну в этом топике, иначе у меня "новая тема" опять в "Пятницу" улетит.

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

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
Firebird 4 - получить timezone сессии?
    #39826199
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

где в это время была Москва? Что тебе даст аналогичный эксперимент например в Яве?
...
Рейтинг: 0 / 0
Firebird 4 - получить timezone сессии?
    #39826200
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя, если в строке:
Код: 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
Firebird 4 - получить timezone сессии?
    #39826202
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисrdb_dev,

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

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


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