xpertzgurtej Ответов: 2

Как предотвратить ввод новых данных между или перекрытие существующего диапазона в таблице SQL


В моей таблице есть два столбца FromMinutes и ToMinutes), и я ввел такие данные, как 5-15 , 16-30, 31-60
Теперь я хочу предотвратить столкновение диапазона, когда я вхожу в новый диапазон. например, новый диапазон не может быть между или перекрывать существующий диапазон, например 7-10 недействителен.12-25 недействителен и 1-70 недействителен. Как написать этот запрос в процедуре вставки?

моя структура таблицы такова :

СОЗДАНИЕ ТАБЛИЦЫ ПО УПРАВЛЕНИЮ ПЕРСОНАЛОМ.tbAttendanceTimeSlots
(
SLOTID INT NOT NULL IDENTITY(1,1) первичный ключ,
Вызываем ИНТ нуль,
ToMinutes INT NULL
)

Что я уже пробовал:

я пытался
ЕСЛИ СУЩЕСТВУЕТ(ВЫБЕРИТЕ 1 ИЗ УЧР.tbAttendanceTimeSlots где (@вызываем между вызываем и Tominutes) и (@ToMinutes между вызываем и Tominutes))
НАЧАТЬ
Возврат -1 --столкновение
КОНЕЦ
ЕЩЕ
НАЧАТЬ
ВСТАВИТЬ В МОД.tbAttendanceTimeSlots
(
Вызываем, ToMinutes
)
ЦЕННОСТИ
(
@FromMinutes,@ToMinutes
)
Возврат 1
КОНЕЦ

2 Ответов

Рейтинг:
2

Richard Deeming

Самый простой способ проверить перекрытие был бы:

IF EXISTS
(
    SELECT 1 
    FROM HRM.tbAttendanceTimeSlots 
    WHERE @FromMinutes <= ToMinutes 
    AND @ToMinutes >= FromMinutes
)


Рейтинг:
19

Member 7870345

Я думаю, что вам нужно только измениться и с вашим статусом или в вашем положении:

IF EXISTS(SELECT 1 FROM HRM.tbAttendanceTimeSlots WHERE (@FromMinutes BETWEEN FromMinutes AND Tominutes) OR  (@ToMinutes BETWEEN FromMinutes AND Tominutes))
BEGIN
RETURN -1 --clashing
END
ELSE
BEGIN
INSERT INTO HRM.tbAttendanceTimeSlots
(
FromMinutes, ToMinutes
)
VALUES
(
@FromMinutes,@ToMinutes
)
RETURN 1
END 


xpertzgurtej

я уже пробовал с или вместо и.. Или отлично работает для предотвращения данных между существующими диапазонами, но не для перекрывающихся диапазонов, таких как 1-70, как я спросил в своем вопросе

Member 7870345

Попробовать это:


ЕСЛИ СУЩЕСТВУЕТ(ВЫБЕРИТЕ 1 ИЗ УЧР.tbAttendanceTimeSlots где (@вызываем между вызываем и Tominutes) или (@ToMinutes между вызываем и Tominutes))
НАЧАТЬ
Возврат -1 --столкновение
КОНЕЦ
ЕСЛИ СУЩЕСТВУЕТ(ВЫБЕРИТЕ 1 ИЗ УЧР.tbAttendanceTimeSlots где (вызываем между @вызываем и @Tominutes) или (ToMinutes между @вызываем и @Tominutes))
НАЧАТЬ
ВОЗВРАТ -1 --ПЕРЕКРЫТИЕ
КОНЕЦ


ВСТАВИТЬ В МОД.tbAttendanceTimeSlots
(
Вызываем, ToMinutes
)
ЦЕННОСТИ
(
@FromMinutes,@ToMinutes
)
Возврат 1

xpertzgurtej

это сработало...спасибо