Как мне найти, что 2 марта и 3 марта приходится на период с 1 марта по 4 марта? - PullRequest
0 голосов
/ 01 марта 2012

Мне нужен способ найти их в Grails:

1) У меня есть две даты, скажем start и end.

2) Пользователь выбирает в браузере две даты, произносят их userStartDate и userEndDate.

У меня есть все эти значения, но мне нужно написать запрос, который обнаружит, что и start, и end находятся между userStartDate и userEndDate.

Например, 2 марта и 3 марта приходится на период с 1 марта по 4 марта.Учитывая, что:

2 марта и 3 марта - даты userStartDate и userEndDate соответственно

1 марта и 4 марта - start и end соответственно.(это доменные объекты).

У меня есть этот код, который работает для между случаями, т.е. start находится в между userStartDate и userEndDate примерно так:

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

Что касается моего вопроса, как я могу прикрепить эту часть к моему коду?

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 01 марта 2012

Самый простой способ выяснить, находится ли одна дата между двумя другими, - использовать объект 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 может небыть оптимальным.Вот пример для проверки, если чей-то день рождения находится между 2 датами, используя критерий запроса

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

def results = User.withCriteria {
  between('birthday', start, end)
}
2 голосов
/ 02 марта 2012

Предполагая, что вы уже проверяете, что userStartDate предшествует userEndDate (проверено, когда пользователь выбирает), и что start предшествует end в базе данных (проверяется при вставке), запрос критерия должен выглядетьчто-то вроде этого:

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

Это проверяет, что start меньше (то есть до) userStartDate и что end больше (то есть после) userEndDate.Также нет необходимости заключать в блок and, так как все предложения неявно и под ред.

2 голосов
/ 01 марта 2012

Дата предоставляет методы до и после (http://docs.oracle.com/javase/6/docs/api/)

if(start.after(userStartDate) && start.before(userEndDate))
{
  //start is between userStartDate && userEndDate
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...