2012-03-01 3 views
-1

мне нужен способ, чтобы найти их в Граалей:Как я узнаю, что 2 марта и 3 марта выпадают между 1 марта и 4 марта?

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) 
       } 
      } 
     } 

В соответствии с моим вопросом, как можно прикрепить эту часть в мой код?

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

+0

У меня нет ни малейшего понятия, что вы спрашиваете –

+0

@ Don: извините, что это была опечатка! –

+0

Я объяснил, как проверить, находится ли дата в пределах диапазона в коде Groovy. Я также объяснил, как это сделать в запросе критериев.Если я фактически не сяду за свой стол и не отредактирую код лично, я не вижу, как я могу сделать для вас гораздо больше. –

ответ

2

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

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

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

2

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

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

'start in userStartDate..userEndDate' читает лучше IMO –

+0

@Don Согласен с вами ... я просто не знал, что groovy имеет эту функцию –

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

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

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

Я попытался добавить ключевое слово' in' в свой запрос, ссылаясь на этот http://grails.org/doc/1.3.7/ref/Domain%20Classes/createCriteria.html, который вызывает ошибку! –

+0

Я обновил свой вопрос с помощью своего кода. –

+0

Код, который вы указали, просто обнаружит, находится ли одно поле домена между ними, мне нужно выяснить, находятся ли ** два файла домена ** между диапазоном. Надеюсь, я вам понятен. –

Смежные вопросы