2014-09-22 112 views
0

我在数据库表中的一个数据与列类型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列返回的记录。虽然支持通过同一日期的开始和结束获取当天的所有记录

回答

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 
} 
+0

复制原稿,它会创建一个日期。但我不会这样做:) – injecteer 2014-09-22 22:23:02

+0

如果'from'和'to'是相同的日期?我会得到那一天的所有记录吗? – birdy 2014-09-22 22:24:13

+0

@Dónal'groovy:000> new Date(“2014/9/22”)。class ===> class java.util.Date' – birdy 2014-09-22 22:25:11

0

我会做这样的

Date from = Date.parse('yyyy-MM-dd', "2014-09-22") 

def count = MyTable.createCriteria().count { 

    gte "dateCreated", from 
    lt "dateCreated", from + 1 
} 
-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

相关问题