在GORM Grails中保存和查询日期

4

我有一个数据库表TableA,其中有一列名为“theDate”,其数据库中的数据类型为DATE。

通过GORM将java.util.Date保存到“theDate”时,当我执行select * from TableA查看表中的数据时,它似乎只保存了日期值。

但是,当我运行以下查询时:

select * from TableA where theDate = :myDate

没有找到结果,但如果我运行类似以下的内容;

select * from TableA where theDate <= :myDate

我能得到结果。

所以时间是相关的。

我的问题是如何保存日期并在完全忽略时间的情况下查询日期,只匹配完全相同的日期?

谢谢。

注意:我也尝试过使用sql.Date和util.Calendar,但没有成功。

5个回答

7

clearTime()

在保存之前和与零比较之前,您可以使用clearTime()清除时间字段:

// zero the time when saving
new MyDomain(theDate: new Date().clearTime()).save()

// zero the target time before comparing
def now = new Date().clearTime()
MyDomain.findAll('SELECT * FROM MyDomain WHERE theDate = :myDate', [myDate: now])

joda-time插件

另一种选择是安装joda-time插件,并使用LocalDate类型(仅包含日期信息,没有时间),而不是Date。就我所知,在处理日期的项目中,我从未没有使用过Joda插件。它完全值得。


1

如果您保存了数据而没有清除,您可以使用范围来检索它,就像Jordan H.所写的那样,但更简单。

def getResults(Date date) {

    def from = date.clearTime()
    def to = from + 1

    def results = MyDomain.findAll("from MyDomain where dateCreated between :start and :stop" ,[start:from,stop:to])

}

0

您的问题可能是一个重复问题,请查看将日期时间转换为日期。但如果有人有更近期的信息,那就太好了。

如果这没有帮助,你可以像我一样使用 BETWEEN 限制来进行修改,例如:

def today = new Date()
def ymdFmt = new java.text.SimpleDateFormat("yyyy-MM-dd")
def dateYmd = ymdFmt.format(today)
def dateTimeFormat = new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
def startDate = dateTimeFormat.parse("${dateYmd} 00:00:00");
def endDate = dateTimeFormat.parse("${dateYmd} 23:59:59");
MyDomain.findAll("from MyDomain where dateCreated between ? and ?", [startDate, endDate])

这肯定不太好看,但它可能会带你到达目的地。


0

我解决了。

我使用了DateGroovyMethods.clearTime来在保存之前清除时间值。


0

在字段类型中,您可以使用DB类型日期而不是datetime。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接