ИМО частью проблемы здесь является схема;система всегда будет бороться, если она явно не имеет начала и конца;не только будет сложно написать запрос, но он будет выполнять вычисления для каждой строки.
Я бы обратился на уровне таблицы, например, с постоянным вычисляемым столбцом:
create table Booking (
Start datetime,
DurationMinutes int,
[End] AS (DATEADD(minute,(DurationMinutes),Start)) PERSISTED
)
Теперь вы можете просто запросить:
where b.Start >= someTime and b.End < someTime
(в качестве примера) - который должен очень четко отображаться в TSQL.
Поскольку это вычисляемый столбец, вы никогда не сможете получитьнесовместимое значение End
;и поскольку он помечен как PERSISTED
, ему не нужно выполнять вычисления для каждой строки (если вы не запутались в опциях SET
...).Вы можете даже индексировать PERSISTED
столбцы, если хотите.