如何在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
与SQLtimestamp
结合使用?MySQL的timestamp数据类型有点愚蠢
它以32位整数的形式存储自历元(1970年1月1日,UTC,午夜)以来的秒数。这有几个问题:
- 没有时间了。您的即时消息有
毫秒,这需要去掉,这就是JOOQ拒绝这样做的原因;这是在破坏数据。我想你不在乎那些米莉,但乔克不知道。你可以试着从瞬间中去掉毫,如果你必须的话,JOOQ可能会允许保存一个瞬间,如果这个瞬间有这样一个属性,它所环绕的epochmills可以被1000整除(没有毫的部分)。除此之外,这很烦人,所以在某些情况下,尽管自epoch以来它存储为32位秒,但数据类型现在也单独包含一个小数秒,从0到999999。要么您有一个旧版本的MySQL,要么底层的表结构不允许这样做,要么JOOQ不知道MySQL至少支持millis.457
- 协调世界时2038-01-19 03:14:07,你的应用程序爆炸。就这样。这是MySQL时间戳对象可表示的最后一个时间戳。我们离这不到18年。因此,此数据类型实际上是不可用的,您应该使用其他数据类型。(这听起来可能不可信。如果你需要一些有说服力的、直接来源的信息,请仔细阅读)。Java的核心即时存储系统不会受到可怕的Y2K38的影响,因为Java在64位中使用了millis;我们还有几十亿年的时间,数字就要用完了
- 请注意,打印的信息有点误导。从epoch开始,瞬间存储为毫秒,并且没有时区,打印输出中的
表明它有时区。事实并非如此,因此mysql的时间戳类型也不是问题所在+00.00
- 日光浴时间:发生或将要发生的事情的时刻,如日光浴。如果某个政治实体决定改变时区,它就没有效果。“事件发生前的时间”/“事件发生后的时间”每秒钟增加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,午夜)以来的秒数。这有几个问题:
- 没有时间了。您的即时消息有
毫秒,这需要去掉,这就是JOOQ拒绝这样做的原因;这是在破坏数据。我想你不在乎那些米莉,但乔克不知道。如果必须的话,你可以尝试从瞬间中去掉毫,JOOQ可能会允许保存一个瞬间,如果这个瞬间具有它所包裹的epochmills的属性.457