gpt4 book ai didi

mysql - jOOQ:如何在自定义时区中创建时间戳(与 JDBC 一样)?

转载 作者:行者123 更新时间:2023-11-29 01:03:19 34 4
gpt4 key购买 nike

精简版

在 MySQL 数据库中,我有一个数据类型为 DATETIME 的列。使用 JDBC,这些值可以设置为 timestamps in a certain timezone .这可以用 jOOQ 来完成吗? ,也是吗?

加长版

我有一个具有此架构的示例表:

CREATE SCHEMA IF NOT EXISTS `my_test_db` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin ;
CREATE TABLE IF NOT EXISTS `my_test_db`.`my_table` (
`id` INT NOT NULL AUTO_INCREMENT ,
`my_time` DATETIME NOT NULL ,
PRIMARY KEY (`id`) )

我对 DATETIME 列特别感兴趣, TIMESTAMP 列。我只想使用 UTC 时间戳 - 无论我从哪里查询数据以及从哪里获取时间戳以插入数据库。

使用 JDBC 我可以解决这个示例应用程序中的问题:

import java.sql.*;
import java.util.Calendar;
import java.util.TimeZone;

public class MyTest {
public static void main(String[] args) throws Exception {

Class.forName("com.mysql.jdbc.Driver");
Connection conn = null;
try {
conn = DriverManager.getConnection("jdbc:mysql://localhost/my_test_db?"
+ "useTimezone=true&useLegacyDatetimeCode=false&serverTimezone=UTC");

PreparedStatement prepStmt = conn.prepareStatement(
"INSERT INTO `my_test_db`.`my_table` (`my_time`) VALUES (?)");

// NB: this particular timestamp is just an example; I actually get
// timestamps from elsewhere but I can be certain that they’re in UTC.
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));

// This is the interesting line which I’d like to port to jOOQ; I can pass
// in an additional “Calendar” object from which time zone information is
// taken into account for the new “DATETIME” value:
prepStmt.setTimestamp(1, new Timestamp(cal.getTimeInMillis()), cal);
prepStmt.executeUpdate();
} finally {
if (conn != null) {
conn.close();
}
}
}
}

在 jOOQ 中,我似乎无法指定时区信息:

// …
DSLContext dslContext = DSL.using(conn);
dslContext.insertInto(MY_TABLE)
.set(MY_TABLE.MY_TIME, new Timestamp(cal.getTimeInMillis()))
.execute();

因此,使用上述 jOOQ 代码创建的任何时间戳都在系统默认时区中。我可以改变吗?

最佳答案

我已经使用一个返回实现 utc_timestamp() 函数的 jOOQ 字段的新类解决了这个问题。

package org.jooq.impl;

import ...

public class Custom_MySQL_UTCTimestamp extends AbstractFunction<Timestamp> {

public Custom_MySQL_UTCTimestamp() {
super("utc_timestamp", SQLDataType.TIMESTAMP);
}

@Override
final Field<Timestamp> getFunction0(Configuration configuration) {
if(configuration.family() == SQLDialect.MYSQL){
return function("utc_timestamp", SQLDataType.TIMESTAMP);
}
return function("current_timestamp", SQLDataType.TIMESTAMP);
}
}

请注意,您必须保留包名称 org.jooq.impl。

然后在我的代码中我这样使用它:

InsertSetMoreStep<TableRecord> insert = db.insertInto(TABLE)
.set(TABLE.DATE,new Custom_MySQL_UTCTimestamp())

TABLE.DATE 是 MySQL 类型 DATETIME

关于mysql - jOOQ:如何在自定义时区中创建时间戳(与 JDBC 一样)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22768635/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com