2010-08-31 3 views
0

У меня запуталась небольшая проблема в 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 утра до 11 утра). На странице создания есть меню для отбрасывания часов, минут и часов/часов в час старта и еще 3 меню отбрасывания для конечного часа. То, что я хочу сделать, это запустить сценарий ajax, который ищет перекрывающиеся записи при изменении выбора меню выбора. Если он найдет один, он вызывает предупреждение js.

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

Любые идеи были бы в высшей степени приняты.

Большое спасибо, Paul

+0

Ваш вопрос действительно о SQL и не имеет никакого отношения к классическому asp, можете ли вы повторно пометить и отредактировать свой вопрос, чтобы удалить ненужные части? – Oded

+0

Я изменил теги соответственно. Мои извинения. – neojakey

ответ

1
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

SELECT * FROM WHERE программ (ProgramStart <= «1900- 01-01 17: 00: 00.000 'и ProgramEnd> =' 1900-01-01 18: 00: 00.000 ') или (ProgramStart <=' 1900-01-01 17: 00: 00.000 'и ProgramEnd <=' 1900 -01-01 18: 00: 00.000 ') или (ProgramStart> =' 1900-01-01 17: 00: 00.000 'и ProgramEnd> =' 1900-01-01 18: 00: 00.000 ') или (ProgramStart > '1900-01-01 17: 00: 00.000' и ProgramEnd <'1900-01-01 18: 00: 00.000') Я запустил сценарий выше сервер, и он возвратил все записи, даже если он должен был вернуть 0.3 записи в db предназначены для: с 9:00 до 11:00, с 11:00 до 13:00, с 13:00 до 16:00. Я все еще в недоумении. Пожалуйста, помогите – neojakey

+0

ах. получил fogot один пункт. убедитесь, что time_from всегда перед time_to. Если вы разрешите обратное определение назначения, заявление не будет работать. –

0

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

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

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

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

+0

SELECT COUNT (1) as tCount FROM Programs WHERE ProgramStart <= '1900-01-01 17: 00: 00.000' AND ProgramEnd <= '1900-01-01 18: 00: 00.000' Я запустил t-sql сценарий выше на сервере, и он возвратил все три записи, даже если он ничего не должен был возвращать. В 3 записи в базе данных для: 9 утра до 11 утра 11 утра до 1 вечера 1 вечера до 4 вечера Я до сих пор нахожусь в недоумении .. Пожалуйста, помогите – neojakey

0

я, наконец, решить эту проблему с помощью следующего 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;" 

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

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