我有一个数据库表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但没有成功。
答案 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)
您可以在字段类型
中使用数据库类型日期而不是日期时间