Предотвращение перекрытия времени встреч - PullRequest
0 голосов
/ 31 августа 2010

У меня маленькая запутанная проблема в SQL-Server 2005 и Classic ASP.У меня есть следующая таблица в базе данных

+-----------+----------+----------+--------------+-------------------------+-------------------------+--------------+
| ProgramID | SystemID | ClientID | ProgramName  | ProgramStart            | ProgramEnd              | ProgramHours |
+-----------+----------+----------+--------------+-------------------------+-------------------------+--------------+
| 22        | 18       | 4        | After Gym    | 1900-01-01 09:00:00.000 | 1900-01-01 11:00:00.000 | 2hrs 0mins   |
| 23        | 18       | 4        | Free Weights | 1900-01-01 12:00:00.000 | 1900-01-01 14:00:00.000 | 2hrs 0mins   |
+-----------+----------+----------+--------------+-------------------------+-------------------------+--------------+

Это в основном показывает программу, которая назначена системе и клиенту на определенный период времени.Я хочу, чтобы пользователь не входил в третью программу, которая перекрывает уже использованное время (например, с 10:00 до 11:00).Страница создания содержит выпадающие меню для часов, минут и утра / вечера для начального часа и еще 3 выпадающих меню для конечного часа.То, что я хочу сделать, это запустить скрипт ajax, который ищет перекрывающиеся записи при изменении выбора в выпадающем меню.Если он находит его, он запускает оповещение js.

Как бы вы обнаружили это совпадение в SQL?

Любые идеи будут очень приняты.*

Ответы [ 3 ]

1 голос
/ 31 августа 2010
SELECT * FROM appointments WHERE 
(time_from <= $from and time_to >= $to) or // determine if the new appointment is fully in an exitent
(time_from <= $from and $from < time_to and time_to <= $to) or // determine if the new appointment starts in an existing and ends after
(time_from >= $from and time_to >= $to and $to > time_from) or // determine if the new appointment starts before an existing and ends in
(time_from > $from and time_to < $to) // determine if the new appointment starts before and ends after

Если выбрано больше записей, существует перекрывающееся редактирование

: я исправил утверждение.теперь оно должно работать.

0 голосов
/ 01 сентября 2010

Я наконец-то решил проблему с помощью следующего оператора SQL:

SELECT COUNT(*) AS Program_Count FROM Programs
WHERE ('1900-01-01 10:00:01.000' BETWEEN ProgramStart AND ProgramEnd)
OR ('1900-01-01 10:59:59.000' BETWEEN ProgramStart   AND ProgramEnd)
OR (ProgramStart BETWEEN '1900-01-01 10:00:01.000' AND '1900-01-01 10:59:59.000')
OR (ProgramEnd BETWEEN '1900-01-01 10:00:01.000' AND '1900-01-01 10:59:59.000')
AND SystemID = 18;"

Спасибо за все ваши предложения, которые при объединении и исследовании принесли мне это решение.

0 голосов
/ 31 августа 2010

Вы можете сделать выбор, чтобы увидеть, попадает ли введенная дата в какие-либо диапазоны:

SELECT COUNT(1) as tCount FROM TABLE WHERE programStart <= formDate AND programEnd  <= formDate

Если он возвращает tCount как> = 1, значит, есть совпадение.

Кроме того, длина вашей программы на самом деле не должна храниться в базе данных, так как это технически повторяющиеся данные, которые будут нуждаться в обновлении каждый раз, когда вы изменяете время программы, я бы порекомендовал, чтобы это значение можно было извлечь при необходимости (используя SQL dateDiff (), например).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...