H2 数据库中的当前时刻

Bas*_*que 3 timestamp h2 sql-timestamp

如何获取H2数据库中实际的当前时钟时间,当前时刻?

CURRENT_TIMESTAMP函数给出当前数据库事务开始的时刻。有没有办法获取当前时刻,即当前语句执行的时间?这可能与 相同或晚于CURRENT_TIMESTAMP

作为比较,在Postgres中,某些函数(例如current_timestamp)返回事务开始时间,而某些函数(例如)clock_timestamp返回实际的当前时钟时间。

Luk*_*der 5

当前时间(函数调用的)

您可以创建一个ALIASfor System.currentTimeMillis()

CREATE ALIAS CURRENT_TIME_MILLIS FOR "java.lang.System.currentTimeMillis";
Run Code Online (Sandbox Code Playgroud)

每当 H2 实际调用该函数时,这不会生成语句执行开始的时间戳,而是实际生成当前时间戳 - 即非确定性时刻,并且同一语句中的不同行可能会生成不同的值。

但也许,这足以满足您的要求。

当前时间(语句执行的时间)

如果上述非确定性解决方案对您来说不够精确,另一种选择是实现一个 JDBC 包装器,它拦截所有语句,将当前时间设置为某个线程本地(H2 不支持Connection.getClientInfo()):

threadlocal.set(new Timestamp(System.currentTimeMillis()).toString());
Run Code Online (Sandbox Code Playgroud)

...然后从ALIAS这样的地方读取客户信息:

threadlocal.set(new Timestamp(System.currentTimeMillis()).toString());
Run Code Online (Sandbox Code Playgroud)

进而:

public static Timestamp statementTime() throws SQLException {
    return Timestamp.valueOf(threadlocal.get());
}
Run Code Online (Sandbox Code Playgroud)