gpt4 book ai didi

grails - grails的乔达日期时间米利斯没有保存在数据库?

转载 作者:行者123 更新时间:2023-12-02 15:22:49 24 4
gpt4 key购买 nike

我尝试根据validFrom和validUntil属性搜索产品的当前价格,当价格过期时,该属性保存信息。

当价格发生变化时,我将旧价格的validUntil属性从null(意味着有效到无穷大)设置为Datetime,直到有效为止。然后我创建一个新的价格,其中的validUntil是1!直到旧的毫秒有效为止。这样,我一直都有每种产品的有效价格。

这是我的测试用例

def endDateOld = DateTime.parse('2015-09-14T10:49:00+02:00')
log.debug "a "+endDateOld.millis
def startDateNew = new DateTime(endDateOld).plusMillis(1)
log.debug "b "+startDateNew.millis

产生
a 1442220540000
b 1442220540001

当我将其保存到数据库时
def money = new MoneyProduct(validFrom:endDateOld, validUntil:startDateNew, amount:199)
money.save(flush:true)

我得到的值是:
log.debug "from "+money.validFrom.millis+" until "+money.validUntil?.millis

输出:
from 1442220540000 until 1442220540000

MoneyProduct类:
class MoneyProduct {

BigDecimal amount
Currency currency = Currency.getInstance("EUR")
DateTime dateCreated

DateTime validFrom
DateTime validUntil

static constraints = {
validUntil(nullable:true)
amount(nullable:false)
}

static belongsTo = [product:Product]
}

也许是配置问题?
Config.groovy:
// Added by the Joda-Time plugin:
grails.gorm.default.mapping = {
"user-type" type: org.jadira.usertype.dateandtime.joda.PersistentDateMidnight, class: org.joda.time.DateMidnight
"user-type" type: org.jadira.usertype.dateandtime.joda.PersistentDateTime, class: org.joda.time.DateTime
"user-type" type: org.jadira.usertype.dateandtime.joda.PersistentDateTimeZoneAsString, class: org.joda.time.DateTimeZone
"user-type" type: org.jadira.usertype.dateandtime.joda.PersistentDurationAsString, class: org.joda.time.Duration
"user-type" type: org.jadira.usertype.dateandtime.joda.PersistentInstantAsMillisLong, class: org.joda.time.Instant
"user-type" type: org.jadira.usertype.dateandtime.joda.PersistentInterval, class: org.joda.time.Interval
"user-type" type: org.jadira.usertype.dateandtime.joda.PersistentLocalDate, class: org.joda.time.LocalDate
"user-type" type: org.jadira.usertype.dateandtime.joda.PersistentLocalDateTime, class: org.joda.time.LocalDateTime
"user-type" type: org.jadira.usertype.dateandtime.joda.PersistentLocalTime, class: org.joda.time.LocalTime
"user-type" type: org.jadira.usertype.dateandtime.joda.PersistentPeriodAsString, class: org.joda.time.Period
"user-type" type: org.jadira.usertype.dateandtime.joda.PersistentTimeOfDay, class: org.joda.time.TimeOfDay
"user-type" type: org.jadira.usertype.dateandtime.joda.PersistentYearMonthDay, class: org.joda.time.YearMonthDay
"user-type" type: org.jadira.usertype.dateandtime.joda.PersistentYears, class: org.joda.time.Years
}

编辑:

看起来joda datetime数据类型在MySQL中存储为DATETIME,仅具有第二精度。我该如何更改?

好。我需要重写默认的休眠映射。我试过了:
static mapping = {
validFrom sqlType: "DATETIME", length: 3
validUntil sqlType: "DATETIME", precision: 3
}

默认情况下,grails默认情况下会创建一个没有长度/精度的datetime列(我使用joda插件),默认为0。这意味着没有精度=秒。在我的情况下,我需要毫秒精度,即@Adam Michalik建议的长度/精度为3(6表示纳米)。

当我将长度更改为3时,grails会自动更新并完美检索毫秒。

最佳答案

您需要告诉mysql您想要的第二小数的大小-0到6的范围。

DATETIME(6)
以获得最大的精度。默认情况下为0,因此您根本不会得到任何毫秒数。
引用 the documentation:

To define a column that includes a fractional seconds part, use the syntax type_name(fsp), where type_name is TIME, DATETIME, or TIMESTAMP, and fsp is the fractional seconds precision. For example:

CREATE TABLE t1 (t TIME(3), dt DATETIME(6));

The fsp value, if given, must be in the range 0 to 6. A value of 0 signifies that there is no fractional part. If omitted, the default precision is 0. (This differs from the standard SQL default of 6, for compatibility with previous MySQL versions.)

关于grails - grails的乔达日期时间米利斯没有保存在数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32561331/

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