2014-09-22 113 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

相關問題