2016-01-15 1 views
0

Я работаю над проектом, где мне нужно предотвратить совпадение времени на ту же дату. Пользователь должен выбрать дату Pick, Drop Date, Pick Time и Drop Time. Моя логика прекрасно работает и препятствует перекрытию времени, но я пытаюсь понять, как я могу позволить пользователю выбрать ту же дату, а затем сравнить время. Вот мой HTML код:Как предотвратить совпадение времени на ту же дату?

<tr> 
    <td> 
    <label>Pick up Date</label> 
    <input name="DateFrom" id="DateFrom" type="text" size="10" maxlength="10" value=""> 
    <label>Pick up Time</label> 
    <input name="TimeFrom" id="TimeFrom" type="text" size="10" maxlength="10" value=""> 
    </td> 
</tr> 

<tr> 
    <td> 
    <label>Drop off Date</label> 
    <input name="DateTo" id="DateTo" type="text" size="10" maxlength="10" value=""> 
    <label>Drop off Time</label> 
    <input name="TimeTo" id="TimeTo" type="text" size="10" maxlength="10" value=""> 
    </td> 
</tr> 

и вот моя логика с переданными аргументами:

<cfargument name="DateFrom" type="string" required="yes"> 
<cfargument name="DateTo" type="string" required="yes"> 
<cfargument name="TimeFrom" type="string" required="yes"> 
<cfargument name="TimeTo" type="string" required="yes"> 

<cfquery name="qryTest"> 
    Select PickDate,DropDate,PickTime,DropTime 
    From ptReservation 
    Order by PickDate 
</cfquery> 

<cfif (arguments.TimeTo LT qryTest.PickTime OR qryTest.DropTime LT arguments.TimeFrom)> 
    <cfquery name="addReservation" datasource="testData"> 
     //Do insert 
    </cfquery> 
</cfif> 

Так, например, мой код будет препятствовать и время перекрывается, но что, если время не в тот же день , Как я могу проверить сначала, если даты совпадают, а затем проверить совпадение времени? если кто-нибудь может помочь с этим, пожалуйста, дайте мне знать.

+0

Хорошее место для начала - просмотр функций по категориям в документации. В частности, [функции даты] (http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec1a60c-7ffc.html#WSc3ff6d0ea77859461172e0811cbec22c24-6986). Для сравнения дат можно использовать несколько. RE: ' Leigh

+1

Если я прав, если предположить, что время срабатывания происходит в Дате отправки (и время простоя происходит в Дата удаления), тогда вы должны комбинировать каждый раз со своей датой, прежде чем сравнивать «Пикап и падение» друг с другом. –

+0

Откуда приходит qryTest? –

ответ

2

Откровенно говоря, хранение даты и времени в отдельных столбцах делает эту задачу труднее, чем она должна быть ИМО. В системе резервирования эти два являются неотъемлемо связанными. Разделение их просто усложняет выполнение общих задач, таких как проверка конфликтов или перекрытий (как поддерживается вашими последними потоками). Если нет веской причины, они должны быть раздельными, я бы рекомендовал перестроить таблицу и сохранить дату и время резервирования в одной колонке.

Например со структурой, как это, вы можете легко проверить для конфликтующих оговорок в одном запросе, даже те, охватывающих несколько дней:

Reservation table structure Reservation table data

При добавлении новой записи, использующие EXISTS чтобы вставить запись, только если не найдено никаких противоречивых оговорок:

<!--- example of reservation date/time to check ---> 
    <cfset requestedStartDateTime = createDateTime(2016, 1, 14, 14, 0, 0)> 
    <cfset requestedEndDateTime = createDateTime(2016, 1, 15, 16, 0, 0)> 
    ... 

    <cfquery result="yourResult" ....> 
    INSERT INTO Reservation (startDateTime, endDateTime, ....) 
    SELECT <cfqueryparam value="#requestedStartDateTime#" cfsqltype="cf_sql_timestamp"> 
      , <cfqueryparam value="#requestedEndDateTime#" cfsqltype="cf_sql_timestamp"> 
      , .... 
    WHERE NOT EXISTS 
      (
      <!--- existing reservation that would overlap ---> 
      SELECT reservationID 
      FROM reservation 
      WHERE startDateTime < <cfqueryparam value="#requestedEndDateTime#" cfsqltype="cf_sql_timestamp"> 
      AND  endDateTime > <cfqueryparam value="#requestedStartDateTime#" cfsqltype="cf_sql_timestamp"> 
     ) 
    </cfquery> 

Вы можете определить результат, изучив cfquery атрибут result. Если result.recordcount> 0, новое резервирование было вставлено. В противном случае вы знаете, что конфликт был найден и может принять соответствующие меры. Протестировано с CF9/11 и MySQL5.6.

CFQuery Result Structure

<cfif yourResult.recordCount gt 0> 
     SUCCESS: New reservation added 
    <cfelse> 
     ERROR: Conflict detected. INSERT failed. 
    </cfif> 

Update: Если таблица содержит какое-то авто приращения колонки, другой вариант использует новое значение идентификатора возвращается as part of the "result" structure. Если он существует, вставка выполнена успешно. В противном случае это не сработало. Обратите внимание, что в более ранних версиях, таких как CF9, имена ключей идентификатора являются специфичными для базы данных, то есть MySQL - "generated_key". С CF10 + вы можете использовать общее ключевое имя generatedKey.

<!--- ID was generated ---> 
    <cfif structKeyExists(yourResult, "generated_key")> 
     SUCCESS: New reservation added 
    <cfelse> 
     ERROR: Conflict detected. INSERT failed. 
    </cfif> 

Если вы совершенно не можете изменить структуру таблицы, другая возможность создать VIEW или COMPUTED COLUMN (если база данных поддерживает), содержащий комбинированную дату и время в одной колонке. Это, по крайней мере, упростит запрос двух значений и позволит вам использовать технику выше для решения вашей проблемы. Однако, хотя это упростило бы SQL, это не всегда SARGable. Таким образом, с большими наборами данных они могут не работать, а также один индексный столбец.

+0

Это работает для меня, и это проще, чем проверить все с помощью cfif, а также сохранить дату и время в той же колонке. У меня есть один вопрос: какой лучший способ защитить cfquery, прежде чем запускать Insert? Должно ли это быть определено или structKeyExist? Спасибо еще раз. –

+1

Как правило, 'structKeyExists' является предпочтительным, потому что он более точен, но во многих случаях чистый эффект тот же. Имейте в виду, что эти две функции проверяют наличие переменной, которая отличается от * empty *. Например, поле формы может быть пустым, но все еще существует на странице действия. – Leigh

+0

Обычно я использую structKeyExist. Я протестировал эту логику, когда нам нужно проверить учетную запись, но это не работает для меня. Запись не вставлена ​​в таблицу, но сообщение всегда указывает, что запись вставлена. Я не уверен, что не так с этим кодом? –