2015-10-08 3 views
0

У меня есть много баз данных на одном сервере, представляющих разные часовые пояса в каждом из них (тихоокеанском, горном, центральном и восточном). Сейчас мои программы используют такие вещи, как 'NOW' и CURRENT_TIMESTAMP, чтобы получить текущее время для записей. Это проблема.Изменение CURRENT_TIMESTAMP для базы данных Firebird

Данные синхронизируются с отдельных компьютеров на этот центральный сервер с использованием SymmetricDS. Однако у меня возникла проблема, что программы, запущенные на этом центральном сервере, написаны так, как если бы они были локальными в офисе. Это означает, что когда он требует метки времени, он делает это в часовом поясе сервера, который может не представлять свой офис. В результате в результате происходит неразрывность данных.

Помимо прохождения программ и перезаписи каждой ситуации, использующей текущее время, мы бы скорее нашли способ представлять время по-разному в каждой базе данных ... как-то компенсировать часовой пояс в каждой базе данных отдельно.

Сделав столько, сколько я могу найти по этой теме, какие у меня варианты?

+0

Если вы знаете часовой пояс, вы можете сохранить его в базе данных и использовать 'dateadd (hour, -cast (: tz_hour как integer), current_timestamp);' –

+0

Дилемма заключается в том, что мы хотим изменить все время связанных с функциями и контекстными переменными в Firebird, чтобы сделать это для нас. У нас есть огромное количество кода, и замена его повсюду займет значительное количество времени: \ – user2085722

+0

К сожалению, нет реальной возможности, за исключением того, что, возможно, ваш сервер работает в UTC, поэтому все системы, по крайней мере, используют одну и ту же дату (но это может по-прежнему разрушать хаос, если клиенты вставляют время или временную метку в локальный часовой пояс). –

ответ

1

Я думаю, вы должны создать процедуру для этой задачи.

Прежде всего, вы можете начать с новой таблицы. Давайте будем использовать следующую структуру: Basic office database

Кроме того, давайте создадим следующую хранимую процедуру:

create or alter procedure GETTIMESTAMP (
    IOFFICE_ID bigint) 
returns (
    RTIMESTAMP timestamp) 
as 
begin 
    RTIMESTAMP=dateadd(hour,coalesce((select TIMEDIFF from OFFICE_TIMEZONE where OFFICE_ID_=:IOFFICE_ID),0), current_timestamp); 
    suspend; 
end 

Эта процедура возвращает правильное время. Если офис не будет использоваться, он вернет current_timestamp локального сервера.

Конечно, это требует некоторой работы, чтобы получить это в вашей базе данных. Чтобы упростить поиск, вы можете выполнять поиск в метаданных базы данных. IBExpert имеет простой диалог поиска, но вы также можете экспортировать метаданные и выполнять поиск через блокнот. IBExpert search in metadata

 Смежные вопросы

  • Нет связанных вопросов^_^