我怎么发现3月2日和3月3日是3月1日到3月4日之间?

时间:2012-03-01 14:46:10

标签: grails groovy

我需要一种方法来在grails中找到它们:

1)我有两个约会startend

2)用户在浏览器中选择两个日期,说明userStartDateuserEndDate

我拥有所有这些值,但我需要编写一个查询,确实发现startend都在userStartDateuserEndDate之间。

例如,3月2日和3月3日是3月1日到3月4日之间。鉴于:

3月2日和3月3日分别为userStartDateuserEndDate日期

3月1日和3月4日分别是startend。 (它们是域对象)。

我的代码适用于 之间的情况,即start位于 userStartDateuserEndDate之间的,如下所示:< / p>

  test = Holiday.createCriteria().list {
            and {
                   user {
                       eq('username',username)
                   }
                   or {
                   between('start',userStartDate,userEndDate) 
                   between('end',userStartDate,userEndDate)
               }
            }
        }

根据我的问题,如何将该部分附加到我的代码中?

提前致谢。

3 个答案:

答案 0 :(得分:2)

日期提供方法之前和之后(http://docs.oracle.com/javase/6/docs/api/)

if(start.after(userStartDate) && start.before(userEndDate))
{
  //start is between userStartDate && userEndDate
}

答案 1 :(得分:2)

确定一个日期是否介于两个其他日期之间的最简单方法是使用Range对象

def start = new Date()
def end = new Date() + 10

// make a date range
def dateRange = start..end

// test if some dates are within the range
def inRange = new Date() + 5
def outsideRange = new Date() + 50    

assert inRange in dateRange
assert !(outsideRange in dateRange)

但是,您提到要比较查询中的日期,因此Groovy解决方案可能不是最佳解决方案。以下是使用条件查询检查某人的生日是否在两个日期之间的示例

def start = new Date()
def end = new Date() + 10

def results = User.withCriteria {
  between('birthday', start, end)
}

答案 2 :(得分:2)

假设您已经检查userStartDateuserEndDate之前(在用户选择时验证)并且start在数据库中end之前(在插入),条件查询应如下所示:

test = Holiday.createCriteria().list {
    user { eq('username',username) }
    lt('start', userStartDate)
    gt('end', userEndDate)
}

这会检查start是否小于(即之前)userStartDateend大于({之后)userEndDate。也不需要包含and块,因为所有子句都是隐式的。