powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Отобразить локальное время
25 сообщений из 35, страница 1 из 2
Отобразить локальное время
    #40124598
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исходная задача: в таблице есть поле DATE_CREATED, в котором хранится время в UTC. Необходимо отобразить в DBGrid локальное время для текущего клиента. Firebird 3.0.7

Варианты решения:

1. В TField.OnGetText делать постоянный пересчет в локальное время. Недостаток: TField.OnGetText вызывается на любую перерисовку строки

2. Написать запрос
Код: sql
1.
2.
3.
4.
SELECT
  DATEADD(:bias MINUTE TO DATE_CREATED) AS DATE_CREATED
FROM
  mytable

Недостаток: я не могу из rdb$fields вытащить описание поля, т.к. поле в запросе перестает ссылаться на таблицу

3. Делать выборку не из таблицы, а из вьюхи. Вьюху описать так
Код: sql
1.
2.
3.
4.
SELECT
  DATEADD(COALESCE(RDB$GET_CONTEXT('USER_SESSION', 'bias'), 0) MINUTE TO DATE_CREATED) AS DATE_CREATED
FROM
  mytable

Переменную bias заполнять после коннекта. Тут, вроде все должно работать.

Вопрос - может есть более прямой способ? Переход на Firebird 4 не предлагать.

С уважением, Vasilisk
...
Рейтинг: 0 / 0
Отобразить локальное время
    #40124601
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Самый нормальный вариант (переход на 4) ты отверг.

Мне нравится вариант 2. Причём тут rdb$fields мне не понятно. Чего ты там хочешь вытаскивать и какая привязка ломается?
...
Рейтинг: 0 / 0
Отобразить локальное время
    #40124602
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
Причём тут rdb$fields мне не понятно
Там лежит локализованное описание поля, которое подтягивается в Caption колонки.
Симонов Денис
Чего ты там хочешь вытаскивать и какая привязка ломается?
Работает примерно так
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT
  rdb$description
FROM
  rdb$fields
WHERE
  rdb$relation_name = :in_rel_name AND
  rdb$field_name = :in_rel_field

А параметры поднимаются
Код: pascal
1.
2.
LRelName := LVarFld.SqlVar.RelName;
LRelField := LVarFld.SqlVar.SqlName
...
Рейтинг: 0 / 0
Отобразить локальное время
    #40124603
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_1. В TField.OnGetText делать постоянный пересчет в локальное время. Недостаток:
TField.OnGetText вызывается на любую перерисовку строки

И в чём проблема? Сложение в Дельфи довольно быстрая операция.
https://stackoverflow.com/questions/15567194/how-to-convert-local-time-to-utc-time-in-delphi-and-how-to-convert-it-back-from
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Отобразить локальное время
    #40124604
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Сложение в Дельфи довольно быстрая операция.
А последующее FormatDateTime?
...
Рейтинг: 0 / 0
Отобразить локальное время
    #40124609
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_А последующее FormatDateTime?

Да, в общем-то тоже. Оно же там по-любому происходит. Я не помню чтобы грид
кэшировал значения ячеек. Хотя тебе никто не мешает это сделать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Отобразить локальное время
    #40124616
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Исходная задача: в таблице есть поле DATE_CREATED, в котором хранится время в UTC. Необходимо отобразить в DBGrid локальное время для текущего клиента. Firebird 3.0.7

Варианты решения:

1. В TField.OnGetText делать постоянный пересчет в локальное время. Недостаток: TField.OnGetText вызывается на любую перерисовку строки

2. Написать запрос
Код: sql
1.
2.
3.
4.
SELECT
  DATEADD(:bias MINUTE TO DATE_CREATED) AS DATE_CREATED
FROM
  mytable

Недостаток: я не могу из rdb$fields вытащить описание поля, т.к. поле в запросе перестает ссылаться на таблицу

А, собственно, почему недостаток? Значение ведь получается не от того поля которое в базе, и тогда какого, собственно, подсовывать описание не от него?

Исходное поле должно иметь описание типа "Дата-время события в UTC".
А новое поле - это "Дата-время события в localtime".

В свое время думал о подобной конструкции - запихать в базу подписи к полям, но отказался, в т.ч. и по твоей причине. У меня в запросах много полей - производных от чего-то. Кроме того, пихать длинные подписи в Caption колонки в гриде неэффективно - их не видно. А вот если поле редактировать - то там можно/нужно и длинное описание показать. Это приводит к тому что единственного описания будет недостаточно.

Активно использую комментирование полей и таблиц в базе, но чисто в целях разработки, для себя же.
...
Рейтинг: 0 / 0
Отобразить локальное время
    #40124633
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraks
У меня в запросах много полей - производных от чего-то.
Вьюхи решают эту проблему
fraks
Кроме того, пихать длинные подписи в Caption колонки в гриде неэффективно - их не видно
А что мешает не пихать длинные заголовки?
fraks
А вот если поле редактировать - то там можно/нужно и длинное описание показать
Опять таки, никто не мешает использовать несколько значений через разделитель. У меня в одном месте используется такой формат
Код: powershell
1.
Caption;Width;Alignment;Default Visible


fraks
Активно использую комментирование полей и таблиц в базе, но чисто в целях разработки, для себя же.
Никогда не испытывал такой потребности. У меня все поля самодокументиремы. Их назначение видно из названия, типа и домена
...
Рейтинг: 0 / 0
Отобразить локальное время
    #40124654
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_> Недостаток: TField.OnGetText вызывается
_Vasilisk_> на любую перерисовку строки

А это где-то во что-то выливается?
Ты же не тысячи строк ежесекундно перерисовываешь...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Отобразить локальное время
    #40124666
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
fraks
У меня в запросах много полей - производных от чего-то.
Вьюхи решают эту проблему

Тогда почему я вижу этот топик?
...
Рейтинг: 0 / 0
Отобразить локальное время
    #40124691
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_

fraks
Кроме того, пихать длинные подписи в Caption колонки в гриде неэффективно - их не видно
А что мешает не пихать длинные заголовки?
fraks
А вот если поле редактировать - то там можно/нужно и длинное описание показать
Опять таки, никто не мешает использовать несколько значений через разделитель. У меня в одном месте используется такой формат
Код: powershell
1.
Caption;Width;Alignment;Default Visible



Собственноручно пихать в реляционную базу строку CSV, с тем что бы потом обратно ее разбирать??
А не проще ли было бы, вместо rdb$fields.rdb$description, сделать свою таблицу, сразу с нужными колонками?
...
Рейтинг: 0 / 0
Отобразить локальное время
    #40124693
shalamyansky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Способы 2 и 3 выглядят странновато по своей сути. На клиенте требуется рассчитать зональное клиентское(!) время по известному серверному абсолютному. Для этого зона отправляется на сервер, сервер производит расчет (сложение) и возвращает результат. Несколько через эээ... через сервер. Сервер SQL как сервис калькуляции. Все чисто клиентское должно считаться на клиенте, ИМХО.

Использование при хранении зональных времен (Firebird 4) вряд ли помогло бы, скорее, внесло бы путаницу. В данной задаче ведь требуется время клиентской зоны, а не той, которая на сервере в значении даты содержится. Все равно пришлось бы пересчитывать из одной зоны в другую, почти то же самое, что из UTC, только с большей вероятностью ошибиться.

Третий способ еще чреват тем, что если на клиенте поменяли зону, не прерывая коннекта (ну мало ли), пойдут искажения.
...
Рейтинг: 0 / 0
Отобразить локальное время
    #40124705
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shalamyansky
пойдут искажения.
Не пойдут. Достаточно отловить WM_TIMECHANGE и пересчитать смещение
...
Рейтинг: 0 / 0
Отобразить локальное время
    #40124732
shalamyansky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4. Не помню внутренностей TField, но я бы попробовал сделать свое поле - наследник TDateTimeField, добавил ему свойство Zone (по умолчанию - системная зона) и переписал ключевой метод GetValue или какой там с учетом этой зоны. Таким образом правильное зональное значение всегда имела бы сама дата-время, а не только демонстрационная строка.
...
Рейтинг: 0 / 0
Отобразить локальное время
    #40124736
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы взял вариант 2 и подумал над механизмом подписи полей не из rdb$fields.rdb$description.

Не знаю, переваривают ли такое датасеты, а просто TpFIBQuery нормально отдает такие конструкции

Код: plsql
1.
select 123 as "Длинное название поля"


Или например, продумать систему именования полей, что бы они не пересекались ни с чем, и описания к ним засунуть в отдельную таблицу, наподобие rdb$fields.rdb$description.
В конструкции подтягивания заголовков сделать обход сначала rdb$fields.rdb$description, а если остались пустые заголовки - то идем в отдельную таблицу с заголовками.
...
Рейтинг: 0 / 0
Отобразить локальное время
    #40124737
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подсовывать чего-либо в TField.OnGetText считаю в корне неправильным.
...
Рейтинг: 0 / 0
Отобразить локальное время
    #40124745
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraks> А не проще ли было бы, вместо rdb$fields.rdb$description,
fraks> сделать свою таблицу, сразу с нужными колонками?

Ну, до внедрения и повсеместного использования
собственного слоя метаданных в БД ещё дорасти надо...
И это точно не проще, хотя гораздо универсальнее.
Ну и далеко не всегда это надо - ради одного Description
я бы этого тоже не делал, хотя если там уже и Alignment,
и Width, и Visible - то скорее пора, чем нет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Отобразить локальное время
    #40124746
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraks> В конструкции подтягивания заголовков сделать обход
fraks> сначала rdb$fields.rdb$description, а если остались пустые
fraks> заголовки - то идем в отдельную таблицу с заголовками.

Если вопрос интересный (судя по всему) - предлагаю создать
отдельный топик. Заодно и на будущее пригодится.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Отобразить локальное время
    #40124747
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraks> Подсовывать чего-либо в TField.OnGetText считаю в корне неправильным.


У этого мнения есть какие-нибудь обоснования?
В частности, конкретно для даты там можно
подсовывать "вчера", "сегодня" и пр.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Отобразить локальное время
    #40124752
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Calculated (InternalCalc) fields уже рассматривались ?
...
Рейтинг: 0 / 0
Отобразить локальное время
    #40124761
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А это лучше OnGetText-а в данном случае?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Отобразить локальное время
    #40124765
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
А это лучше OnGetText-а в данном случае?
InternalCalc - однозначно лучше, но не всегда доступны, просто Calculated - надеюсь да, но проверять не буду.
С точки зрения логики и правил использования инструмента - точно лучше.
С точки зрения эффективности реализации - есть документация, исходники и отладчик.
...
Рейтинг: 0 / 0
Отобразить локальное время
    #40124784
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да, по идее они должны быть производительнее, конечно.
Но лень проверять, да и сложно это (визуальную составляющую).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Отобразить локальное время
    #40124790
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
fraks> Подсовывать чего-либо в TField.OnGetText считаю в корне неправильным.
У этого мнения есть какие-нибудь обоснования?

Запрос возвращает одно значение, а видим мы другое? Это нормально?
А давайте поставим условие по дате. Ой... а чего-то оно неправильно срабатывает...

Гаджимурадов Рустам
В частности, конкретно для даты там можно
подсовывать "вчера", "сегодня" и пр.

С не меньшим успехом можно подсовывать и в запросе. Правда поле будет уже не TDateTime а String.
...
Рейтинг: 0 / 0
Отобразить локальное время
    #40124883
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraks> Запрос возвращает одно значение, а видим мы другое? Это нормально?

Конечно. Запрос возвращает дату в своём формате,
пользователь видит в своём. Ты только против дат
таким образом возражаешь или в принципе?
В "булевых" полях же ты как-то дорисовываешь?

> А давайте поставим условие по дате.
> Ой... а чего-то оно неправильно срабатывает...

Отчего же. И фильтрация, и сортировка и всё
остальное могут и должны рабоать корректно.

> С не меньшим успехом можно подсовывать и в запросе.
> Правда поле будет уже не TDateTime а String.

Правильно, в запросе будет строка. А в OnGetText
тип поля менять не нужно, это только визуализация.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 35, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Отобразить локальное время
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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