|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
Исходная задача: в таблице есть поле DATE_CREATED, в котором хранится время в UTC. Необходимо отобразить в DBGrid локальное время для текущего клиента. Firebird 3.0.7 Варианты решения: 1. В TField.OnGetText делать постоянный пересчет в локальное время. Недостаток: TField.OnGetText вызывается на любую перерисовку строки 2. Написать запрос Код: sql 1. 2. 3. 4.
Недостаток: я не могу из rdb$fields вытащить описание поля, т.к. поле в запросе перестает ссылаться на таблицу 3. Делать выборку не из таблицы, а из вьюхи. Вьюху описать так Код: sql 1. 2. 3. 4.
Переменную bias заполнять после коннекта. Тут, вроде все должно работать. Вопрос - может есть более прямой способ? Переход на Firebird 4 не предлагать. С уважением, Vasilisk ... |
|||
:
Нравится:
Не нравится:
|
|||
03.01.2022, 22:38 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
_Vasilisk_, Самый нормальный вариант (переход на 4) ты отверг. Мне нравится вариант 2. Причём тут rdb$fields мне не понятно. Чего ты там хочешь вытаскивать и какая привязка ломается? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.01.2022, 22:54 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
Симонов Денис Причём тут rdb$fields мне не понятно Симонов Денис Чего ты там хочешь вытаскивать и какая привязка ломается? Код: sql 1. 2. 3. 4. 5. 6. 7.
А параметры поднимаются Код: pascal 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.01.2022, 23:02 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
_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 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.01.2022, 23:03 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Сложение в Дельфи довольно быстрая операция. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.01.2022, 23:09 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
_Vasilisk_А последующее FormatDateTime? Да, в общем-то тоже. Оно же там по-любому происходит. Я не помню чтобы грид кэшировал значения ячеек. Хотя тебе никто не мешает это сделать. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.01.2022, 23:28 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
_Vasilisk_ Исходная задача: в таблице есть поле DATE_CREATED, в котором хранится время в UTC. Необходимо отобразить в DBGrid локальное время для текущего клиента. Firebird 3.0.7 Варианты решения: 1. В TField.OnGetText делать постоянный пересчет в локальное время. Недостаток: TField.OnGetText вызывается на любую перерисовку строки 2. Написать запрос Код: sql 1. 2. 3. 4.
Недостаток: я не могу из rdb$fields вытащить описание поля, т.к. поле в запросе перестает ссылаться на таблицу А, собственно, почему недостаток? Значение ведь получается не от того поля которое в базе, и тогда какого, собственно, подсовывать описание не от него? Исходное поле должно иметь описание типа "Дата-время события в UTC". А новое поле - это "Дата-время события в localtime". В свое время думал о подобной конструкции - запихать в базу подписи к полям, но отказался, в т.ч. и по твоей причине. У меня в запросах много полей - производных от чего-то. Кроме того, пихать длинные подписи в Caption колонки в гриде неэффективно - их не видно. А вот если поле редактировать - то там можно/нужно и длинное описание показать. Это приводит к тому что единственного описания будет недостаточно. Активно использую комментирование полей и таблиц в базе, но чисто в целях разработки, для себя же. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.01.2022, 08:24 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
fraks У меня в запросах много полей - производных от чего-то. fraks Кроме того, пихать длинные подписи в Caption колонки в гриде неэффективно - их не видно fraks А вот если поле редактировать - то там можно/нужно и длинное описание показать Код: powershell 1.
fraks Активно использую комментирование полей и таблиц в базе, но чисто в целях разработки, для себя же. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.01.2022, 12:18 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
_Vasilisk_> Недостаток: TField.OnGetText вызывается _Vasilisk_> на любую перерисовку строки А это где-то во что-то выливается? Ты же не тысячи строк ежесекундно перерисовываешь... Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.01.2022, 14:36 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
_Vasilisk_ fraks У меня в запросах много полей - производных от чего-то. Тогда почему я вижу этот топик? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.01.2022, 15:40 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
_Vasilisk_ fraks Кроме того, пихать длинные подписи в Caption колонки в гриде неэффективно - их не видно fraks А вот если поле редактировать - то там можно/нужно и длинное описание показать Код: powershell 1.
Собственноручно пихать в реляционную базу строку CSV, с тем что бы потом обратно ее разбирать?? А не проще ли было бы, вместо rdb$fields.rdb$description, сделать свою таблицу, сразу с нужными колонками? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.01.2022, 19:36 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
Способы 2 и 3 выглядят странновато по своей сути. На клиенте требуется рассчитать зональное клиентское(!) время по известному серверному абсолютному. Для этого зона отправляется на сервер, сервер производит расчет (сложение) и возвращает результат. Несколько через эээ... через сервер. Сервер SQL как сервис калькуляции. Все чисто клиентское должно считаться на клиенте, ИМХО. Использование при хранении зональных времен (Firebird 4) вряд ли помогло бы, скорее, внесло бы путаницу. В данной задаче ведь требуется время клиентской зоны, а не той, которая на сервере в значении даты содержится. Все равно пришлось бы пересчитывать из одной зоны в другую, почти то же самое, что из UTC, только с большей вероятностью ошибиться. Третий способ еще чреват тем, что если на клиенте поменяли зону, не прерывая коннекта (ну мало ли), пойдут искажения. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.01.2022, 19:40 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
shalamyansky пойдут искажения. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.01.2022, 21:33 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
4. Не помню внутренностей TField, но я бы попробовал сделать свое поле - наследник TDateTimeField, добавил ему свойство Zone (по умолчанию - системная зона) и переписал ключевой метод GetValue или какой там с учетом этой зоны. Таким образом правильное зональное значение всегда имела бы сама дата-время, а не только демонстрационная строка. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 02:14 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
Я бы взял вариант 2 и подумал над механизмом подписи полей не из rdb$fields.rdb$description. Не знаю, переваривают ли такое датасеты, а просто TpFIBQuery нормально отдает такие конструкции Код: plsql 1.
Или например, продумать систему именования полей, что бы они не пересекались ни с чем, и описания к ним засунуть в отдельную таблицу, наподобие rdb$fields.rdb$description. В конструкции подтягивания заголовков сделать обход сначала rdb$fields.rdb$description, а если остались пустые заголовки - то идем в отдельную таблицу с заголовками. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 08:18 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
Подсовывать чего-либо в TField.OnGetText считаю в корне неправильным. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 08:19 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
fraks> А не проще ли было бы, вместо rdb$fields.rdb$description, fraks> сделать свою таблицу, сразу с нужными колонками? Ну, до внедрения и повсеместного использования собственного слоя метаданных в БД ещё дорасти надо... И это точно не проще, хотя гораздо универсальнее. Ну и далеко не всегда это надо - ради одного Description я бы этого тоже не делал, хотя если там уже и Alignment, и Width, и Visible - то скорее пора, чем нет. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 11:46 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
fraks> В конструкции подтягивания заголовков сделать обход fraks> сначала rdb$fields.rdb$description, а если остались пустые fraks> заголовки - то идем в отдельную таблицу с заголовками. Если вопрос интересный (судя по всему) - предлагаю создать отдельный топик. Заодно и на будущее пригодится. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 11:47 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
fraks> Подсовывать чего-либо в TField.OnGetText считаю в корне неправильным. У этого мнения есть какие-нибудь обоснования? В частности, конкретно для даты там можно подсовывать "вчера", "сегодня" и пр. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 11:48 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
Calculated (InternalCalc) fields уже рассматривались ? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 12:37 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
А это лучше OnGetText-а в данном случае? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 13:34 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустам А это лучше OnGetText-а в данном случае? С точки зрения логики и правил использования инструмента - точно лучше. С точки зрения эффективности реализации - есть документация, исходники и отладчик. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 13:48 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
Ну да, по идее они должны быть производительнее, конечно. Но лень проверять, да и сложно это (визуальную составляющую). Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 14:39 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустам fraks> Подсовывать чего-либо в TField.OnGetText считаю в корне неправильным. У этого мнения есть какие-нибудь обоснования? Запрос возвращает одно значение, а видим мы другое? Это нормально? А давайте поставим условие по дате. Ой... а чего-то оно неправильно срабатывает... Гаджимурадов Рустам В частности, конкретно для даты там можно подсовывать "вчера", "сегодня" и пр. С не меньшим успехом можно подсовывать и в запросе. Правда поле будет уже не TDateTime а String. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 14:57 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
fraks> Запрос возвращает одно значение, а видим мы другое? Это нормально? Конечно. Запрос возвращает дату в своём формате, пользователь видит в своём. Ты только против дат таким образом возражаешь или в принципе? В "булевых" полях же ты как-то дорисовываешь? > А давайте поставим условие по дате. > Ой... а чего-то оно неправильно срабатывает... Отчего же. И фильтрация, и сортировка и всё остальное могут и должны рабоать корректно. > С не меньшим успехом можно подсовывать и в запросе. > Правда поле будет уже не TDateTime а String. Правильно, в запросе будет строка. А в OnGetText тип поля менять не нужно, это только визуализация. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 21:04 |
|
|
start [/forum/topic.php?fid=40&msg=40124790&tid=1559847]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
158ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
71ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 288ms |
0 / 0 |