Grails - 将字符串数据转换为Date

时间:2013-07-11 08:54:19

标签: grails

让我们说,我有一个“Book”类,其字段为“availableOn”(如下所示)。

class Book {
    String availableOn;
}

字段包含值

  • “所有日子”或
  • 日期的字符串表示形式。例如“13/06/2012”

我怎样才能获得未来两天内可用的所有图书?下面的代码会引发异常(“java.util.Date不能转换为java.lang.String”)

def books = c.list(){
    between('availableOn', new Date(), new Date() + 2)
}

PS:我正在处理遗留数据库,因此不应该更改架构:(

3 个答案:

答案 0 :(得分:1)

我认为between陈述会有两个问题:

    如果
  • availableOn的值为Date
  • ,则无法转换为All days进行比较
  • 即使availableOn中包含日期值,也不会将其转换为Date进行比较

我会尝试这样做:

def now = new Date()
def books = Book.findAllByAvailableNotEqual("All days").findAll { book ->
    Date.parse('dd/MM/yyyy', book.availableOn) > now && Date.parse('dd/MM/yyyy', book.availableOn) < now+2
}

显然,这可以通过更好的方式完成(例如,向域类添加一些方法),但这应该说明我的想法......

答案 1 :(得分:0)

您可以在日期上使用format来获取所需的字符串格式。

new Date().format('dd/MM/yyyy')

您的标准将被修改为

def books = c.list(){
    def todayDateStr = new Date().format('dd/MM/yyyy')
    def twoDaysAfterTodayDateStr = (new Date()+2).format('dd/MM/yyyy')
    or{
        between('availableOn', todayDateStr, twoDaysAfterTodayDateStr)
        eq 'availableOn', 'All Days'
    }
}

测试str比较是否有效,否则必须使用其他方法。从电话发送,原谅我的错别字。

<强>更新
当日期类似于“01/01/2013”​​和“07/11/2011”时,上述情况会在特殊情况下失败。 或者,您可以使用sqlRestriction,但在这种情况下,它会与底层数据库紧密耦合。如果使用Oracle数据库,可以执行以下操作:

def books = c.list(){
    def todayDateStr = new Date().format('dd/MM/yyyy')
    def twoDaysAfterTodayDateStr = (new Date()+2).format('dd/MM/yyyy')
    or{
        sqlRestriction "to_date(available_on, 'DD/MM/YYYY') between to_date(todayDateStr, 'DD/MM/YYYY') and to_date(twoDaysAfterTodayDateStr, 'DD/MM/YYYY')"
        eq 'availableOn', 'All Days'
    }
}

答案 2 :(得分:0)

我没有基于标准的解决方案,但你可以尝试这样的事情:

Book.executeQuery(
      "select book from Book book where book.availableOn = :availableOn or to_date(book.availableOn, :format) between (:startDate, :endDate) ",
     [availableOn:"All days", format: "dd/MM/yyyy", startDate: startDate, endDate:endDate])

我的解决方案的问题是此查询变得依赖于DB。 to_date是Oracle函数。您可能希望更改此选项以适合您的数据库