有没有办法让Criteria只匹配日期而不匹配时间戳



我在一个列类型为DATETIME 的DB表中有数据

它有如下条目:

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列返回记录的条件,同时忽略时间戳。同时支持通过相同的开始和结束日期来获取当天的所有记录

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
}

我会像这个一样做

Date from = Date.parse('yyyy-MM-dd', "2014-09-22")
def count = MyTable.createCriteria().count {
  gte "dateCreated", from
  lt "dateCreated", from + 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

http://groovy.codehaus.org/JN0545-Dates

最新更新