Текущий момент в базе данных H2

Как получить фактическое текущее время часов, текущий момент в базе данных H2?

Функция CURRENT_TIMESTAMP выдает момент начала текущей транзакции базы данных. Есть ли способ получить текущий момент, время выполнения текущего оператора? Это может быть то же или более позднее, чем CURRENT_TIMESTAMP.

Для сравнения, в Postgres некоторые функции, такие как current_timestamp, возвращают время начала транзакции, а некоторые функции, такие как clock_timestamp вернуть фактическое текущее время часов.


person Basil Bourque    schedule 27.12.2015    source источник


Ответы (1)


Текущее время (вызова функции)

Вы можете создать ALIAS для System.currentTimeMillis():

CREATE ALIAS CURRENT_TIME_MILLIS FOR "java.lang.System.currentTimeMillis";

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

Но, возможно, этого достаточно для ваших требований.

Текущее время (выполнения оператора)

Если приведенное выше недетерминированное решение недостаточно точно для вас, другим вариантом может быть реализация оболочки JDBC, которая перехватывает все операторы, устанавливает текущее время в какой-либо локальный поток (H2 не поддерживает Connection.getClientInfo()):

threadlocal.set(new Timestamp(System.currentTimeMillis()).toString());

... а затем считывает эту информацию о клиенте из ALIAS следующим образом:

public static Timestamp statementTime() throws SQLException {
    return Timestamp.valueOf(threadlocal.get());
}

А потом:

CREATE ALIAS STATEMENT_TIME FOR "com.example.statementTime";
person Lukas Eder    schedule 27.12.2015
comment
Не могли бы вы объяснить, в какой класс должен быть помещен этот код threadlocal.set(new Timestamp(System.currentTimeMillis()).toString());? - person Pavel_K; 20.04.2017
comment
В оболочке/прокси JDBC, которая будет выполнять это каждый раз, когда вы запускаете что-то вроде Connection.prepareStatement(). Тебе решать. - person Lukas Eder; 20.04.2017