我在其中一个列类型为DATETIME
它有如下条目:
2014-09-22 14:55:14
2014-09-22 16:20:05
2014-09-22 14:55:15
我从前端拿了两个参数。开始日期和结束日期。但有时用户希望看到今天创造的所有东西。因此,当期望为特定日期(无论时间)创建的所有记录时,它们都会在开始和结束时传递相同的日期。
但是使用以下标准他们没有记录回来。
def c = MyTable.createCriteria()
def count = c.count {
gt ("dateCreated", new Date("9/22/2014)
lt ("dateCreated", new Date("9/22/2014)
}
问题
如何编写一个带有两个日期(开始和结束)的条件,并从DATETIME
列返回记录,同时忽略时间戳。同时支持为开始和结束传递相同的日期以获取当天的所有记录
答案 0 :(得分:1)
在HQL中,有month()
,day()
等日期函数,因此您可以和它们一起进行搜索。
在标准中,只有sqlRestriction
才能实现这一目标,但我认为这很难看。
所以,我建议使用更清洁的方法:
Date from = Date.parse('yyyy-MM-dd', "2014-09-22")
from.clearTime() // call it, if from might have the hh:mm:ss section
Date to = from + 1
def c = MyTable.createCriteria()
def count = c.count {
between "dateCreated", from, to
}
答案 1 :(得分:0)
我会这样做
Date from = Date.parse('yyyy-MM-dd', "2014-09-22")
def count = MyTable.createCriteria().count {
gte "dateCreated", from
lt "dateCreated", from + 1
}
答案 2 :(得分:-1)
您可以使用一些Groovy的日期/时间方法将开始日期设为开始时间为12AM(0小时,0分钟,0秒),结束日期为结束时间11:59: 59(23小时59分59秒)例如:
import static java.util.Calendar.* //...needed to supply YEAR and MONTH
def rawEndDate = new Date() //...the user-supplied end date
def endDate = new Date()
endDate.set(
year: rawEndDate[YEAR],
month: rawEndDate[MONTH],
date: rawEndDate.getDate(),
hourOfDay: 23,
minute: 59,
second: 59)
...然后,如果您在标准中使用这些操纵日期,那么如果用户选择了开始日期和结束日期的同一天,则无关紧要:您仍然可以通过创建来获取记录从一天的开始到结束之间的日期。
不幸的是,如果还有一种方法可以设置毫秒 - 将开始日期设置为0毫秒,结束日期设置为999 - 我不知道它。当我最近必须解决类似的问题时,我可以自由地在JavaScript中操作开始和结束日期,并且我可以很容易地设置毫秒。
一些相关的参考文献:
http://mrhaki.blogspot.com/2010/06/groovy-goodness-use-set-method-to.html