Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在jOOQ中使用SQL时间戳和java Instant?_Java_Mysql_Timestamp_Jooq_Java.time.instant - Fatal编程技术网

如何在jOOQ中使用SQL时间戳和java Instant?

如何在jOOQ中使用SQL时间戳和java Instant?,java,mysql,timestamp,jooq,java.time.instant,Java,Mysql,Timestamp,Jooq,Java.time.instant,我想使用Instant类型将其放入MySQL数据库(timestamp字段)。不幸的是,在使用POJO和Record#from()时,由于某些原因,jOOQ不允许我这样做。我的gradle配置有以下内容: forcedTypes { forcedType { name = "Instant" types = "timestamp" } } 代码生成正确,但不起作用,并在运行时出错: Data trunca

我想使用
Instant
类型将其放入MySQL数据库(
timestamp
字段)。不幸的是,在使用POJO和
Record#from()
时,由于某些原因,jOOQ不允许我这样做。我的gradle配置有以下内容:

forcedTypes {
    forcedType {
        name = "Instant"
        types = "timestamp"
    }
}
代码生成正确,但不起作用,并在运行时出错:

 Data truncation: Incorrect datetime value: '2021-01-16 05:01:25.457+00:00' for column `test`.`messages`.`time_sent` at row 1
我试图添加我自己的转换器和活页夹,但如果在gradle config中设置了
name
,它们似乎不起作用,因为在构建过程中会出现警告。但是没有
name
我无法让jOOQ为
timestamp
字段生成
Instant


当使用jOOQ的POJO时,有没有一种方法可以将
Instant
与SQL
timestamp
结合使用?

MySQL的timestamp数据类型有点愚蠢

它以32位整数的形式存储自历元(1970年1月1日,UTC,午夜)以来的秒数。这有几个问题:

  • 没有时间了。您的即时消息有
    .457
    毫秒,这需要去掉,这就是JOOQ拒绝这样做的原因;这是在破坏数据。我想你不在乎那些米莉,但乔克不知道。你可以试着从瞬间中去掉毫,如果你必须的话,JOOQ可能会允许保存一个瞬间,如果这个瞬间有这样一个属性,它所环绕的epochmills可以被1000整除(没有毫的部分)。除此之外,这很烦人,所以在某些情况下,尽管自epoch以来它存储为32位秒,但数据类型现在也单独包含一个小数秒,从0到999999。要么您有一个旧版本的MySQL,要么底层的表结构不允许这样做,要么JOOQ不知道MySQL至少支持millis
  • 协调世界时2038-01-19 03:14:07,你的应用程序爆炸。就这样。这是MySQL时间戳对象可表示的最后一个时间戳。我们离这不到18年。因此,此数据类型实际上是不可用的,您应该使用其他数据类型。(这听起来可能不可信。如果你需要一些有说服力的、直接来源的信息,请仔细阅读)。Java的核心即时存储系统不会受到可怕的Y2K38的影响,因为Java在64位中使用了millis;我们还有几十亿年的时间,数字就要用完了
  • 请注意,打印的信息有点误导。从epoch开始,瞬间存储为毫秒,并且没有时区,打印输出中的
    +00.00
    表明它有时区。事实并非如此,因此mysql的时间戳类型也不是问题所在
解决 到目前为止,最好的解决方案是使用一个不会像这样崩溃的数据库引擎。例如,试试postgres

第二个遥远的解决方案是仔细阅读@lucaseder(JOOQ的核心贡献者;他是在那里施展魔法的天才:p)说它还不起作用,但是那里有一些代码你可以使用

请注意,如果您真正关心分区,这将变得更加复杂。有三种不同的方式来表示时间;这些是不同的,没有额外的信息和注意事项,不能相互转换;不管怎样,大多数工具都错误地默默地转换它们,当这种情况发生时,痛苦随之而来。因此,您可能需要考虑以下三种时间中的哪一种:

  • 日光浴时间:发生或将要发生的事情的时刻,如日光浴。如果某个政治实体决定改变时区,它就没有效果。“事件发生前的时间”/“事件发生后的时间”每秒钟增加1秒,无论时区发生了什么。用java术语来说,
    java.time.Instant
  • 预约时间:我打电话给阿姆斯特丹的理发师,预约时间是2023年1月5日14:00。你可能会认为这就像是日光浴时间,但是,不是。如果荷兰议会关闭了木槌,通过了一项法律,荷兰将不再遵守夏令时,并将保留在夏季,那么木槌一落下,我的约会就会延长一小时(是不是缩短了一小时?)。这一点也不奇怪——见欧盟指令2000/84/EC——事实上,这是可能的。日光浴的时间不应该像这样改变,约会的时间也应该如此。最好用年+月+日+小时+分+秒+毫秒+一个完整的区域来表示(这是
    欧洲/阿姆斯特丹
    ,而不是像
    +0800
    太平洋标准时间
    这样愚蠢无用的东西)。用java术语来说,
    zoneDateTime
  • 闹钟时间:只有年、月、日、时、分、秒。就这样-它不代表任何特别的东西,只代表概念。如果我把闹钟设置为早上8点叫醒我,然后我去太平洋旅行,当我移动时区时,闹钟响之前的时间应该会发生巨大的变化。用java术语来说,
    LocalDateTime
    和朋友

我假设您有一个solarflares时间(例如,跟踪“用户X此时更改其密码”)。这个答案假设你是这个意思。如果你不这样做,我的建议会改变一点。大多数情况下,“不要使用mysql”这件事会变得更加强大:你真正想要的是带有时区的数据类型
TIMESTAMP
,比如。

mysql的TIMESTAMP数据类型有点愚蠢

它以32位整数的形式存储自历元(1970年1月1日,UTC,午夜)以来的秒数。这有几个问题:

  • 没有时间了。您的即时消息有
    .457
    毫秒,这需要去掉,这就是JOOQ拒绝这样做的原因;这是在破坏数据。我想你不在乎那些米莉,但乔克不知道。如果必须的话,你可以尝试从瞬间中去掉毫,JOOQ可能会允许保存一个瞬间,如果这个瞬间具有它所包裹的epochmills的属性