在GORM Grails中保存和查询日期

时间:2011-07-19 15:19:14

标签: grails date gorm

我有一个数据库表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 个答案:

答案 0 :(得分:7)

<强> clearTime()

您可以在保存前使用clearTime(),然后在比较时间字段为零之前使用{<3}}:

// 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 plugin并使用LocalDate类型(仅保留日期信息,而不是Date)。对于它的价值,我不认为我在没有使用Joda插件的情况下使用日期工作。这完全是值得的。

答案 1 :(得分: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])

}

答案 2 :(得分:0)

您的问题可能重复。见Convert datetime in to date。但如果有人有更新的信息,那就太好了。

如果这没有帮助,你可以按照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])

这绝对不是很漂亮,但它可能会让你到达目的地。

答案 3 :(得分:0)

我明白了。

我使用DateGroovyMethods.clearTime清除保存前的时间值。

答案 4 :(得分:0)

您可以在字段类型

中使用数据库类型日期而不是日期时间