我尝试根据validFrom& amp;来搜索产品的当前货币。 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
当我将其保存到DB
时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,只有第二个精度。我怎么能改变这个?
确定。我需要覆盖默认的hibernate映射。我试过了:
static mapping = {
validFrom sqlType: "DATETIME", length: 3
validUntil sqlType: "DATETIME", precision: 3
}
默认情况下,grails正在创建一个日期时间列(我使用joda插件),没有长度/精度,默认为0.这意味着没有精度=秒。在我的情况下,我需要毫秒精度,即@Adam Michalik建议的长度/精度为3(6将为纳米)
当我将长度更改为3时,手动grails更新并完美地检索毫秒。
答案 0 :(得分:0)
你需要告诉mysql你想要的第二个小数的大小 - 范围是0到6.使用
DATETIME(6)
获得最大可用精度。默认情况下,它为0,所以你根本不会得到任何毫秒。
要定义包含小数秒部分的列,请使用语法
type_name(fsp)
,其中type_name为TIME
,DATETIME
或TIMESTAMP
,以及{{1}是小数秒精度。例如:
fsp
CREATE TABLE t1 (t TIME(3), dt DATETIME(6));
值(如果给定)必须在0到6的范围内。值0表示没有小数部分。如果省略,则默认精度为0.(这与标准SQL默认值6不同,以便与以前的MySQL版本兼容。)