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

时间:2014-09-22 22:02:21

标签: hibernate grails

我在其中一个列类型为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列返回记录,同时忽略时间戳。同时支持为开始和结束传递相同的日期以获取当天的所有记录

3 个答案:

答案 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

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