【问题标题】:How do I find that March 2nd and March 3rd falls between March 1st and March 4th?如何找到 3 月 2 日和 3 月 3 日在 3 月 1 日和 3 月 4 日之间?
【发布时间】:2012-03-01 14:46:09
【问题描述】:

我需要一种在 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。 (它们是域对象)。

我有这段代码适用于 between 情况,即startbetween userStartDateuserEndDate 中,如下所示:

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

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

提前致谢。

【问题讨论】:

  • 我完全不知道你在问什么
  • 我已经解释了如何检查日期是否在 Groovy 代码的范围内。我还解释了如何在条件查询中执行此操作。除非我真的坐在你的办公桌前亲自编辑代码,否则我看不出我能为你做更多的事情
  • @Don : 真的很抱歉造成混乱。我想要一个相反的,因为我现在已经编辑了我的问题。

标签: grails groovy


【解决方案1】:

假设您已经检查userStartDateuserEndDate 之前(在用户选择时验证)并且start 在数据库中end 之前(在插入时验证),条件查询应该看起来像这样:

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

这将检查 start 是否小于(即之前)userStartDate 以及 end 是否大于(即之后)userEndDate。也不需要包裹在 and 块中,因为所有子句都是隐式的 and-ed。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • @Don 同意你的看法...我只是不知道 groovy 有这个功能
    【解决方案3】:

    判断一个日期是否在另外两个日期之间的最简单方法是使用 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)
    }
    

    【讨论】:

    • 我已经尝试在我的查询中添加 in 关键字来引用这个 grails.org/doc/1.3.7/ref/Domain%20Classes/createCriteria.html,这会引发错误!
    • 你给出的代码只会查找一个域字段是否介于两者之间,我需要查找两个域文件是否在一个范围之间。希望我对你很清楚。
    • @Ant's 很遗憾,您根本不清楚。上面的代码已经检查了两个字段是否在一个范围内,start 字段和end 字段
    • 很抱歉给您带来了困惑。我想要一个反向的!即userStartDate,userEndDate 应属于startend 字段
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 2021-02-22
    相关资源
    最近更新 更多