предложение where со столбцами времени на сервере sql - PullRequest
0 голосов
/ 12 октября 2011

В проекте есть функционал, который позволяет вам забронировать место в течение дня, им нужно ввести день, время начала и время окончания с 7:00 до 12:00 (полночь) или 1:00. Например, если кто-то введет дату = 21 / октябрь / 2011 время начала = 20:00 и время окончания 12:00 (он бронирует место с 20:00 до 12:00), веб-форма отправляется в процедуру хранения 20:00 и 00:00, чтобы проверить таблицу, чтобы увидеть, есть ли в наличии, если кто-то уже заказал в тот же день до полуночи, это магазин, как это startime = 23: 00 endtime = 00: 00

, поэтому, когда я проверяю нового клиента, он должен вернуть, что резервирование уже в диапазоне времени, мой запрос не эффективен, но он работает с 7:00 до 23:00, он не работает, когда из webfrom входит в конечное время 12:00 (00:00 по sql), потому что время начала больше, чем время окончания

это мой запрос

select COUNT(*)
    from table1
    where id_place=@id_place
    and date=@date  
       and (
           (@start_time=res_start_time and @end_time=res_end_time)
        or (@start_time > res_start_time and @start_time < res_end_time)
        or (@end_time > res_start_time and res_end_time < res_end_time)
        or (res_start_time > @start_time and res_start_time < @end_time)
        or (res_end_time > @start_time and res_end_time < @end_time)
        or (res_start_time < @start_time and res_end_time >@end_time)
          )     


    -- @start_time  = start time of the reservations (from webform)
    -- @end_time    = end time of the reservations (from webform)

    -- res_start_time= represents the start time column
    -- res_ebd_time= represents the end time column

Мне нужна помощь по двум вещам: как я решил проблему, когда мне нужно проверить время, такое как 12:00 или 1:00, которое уже есть в таблице, как пример в начале вопроса, и проверить мой запрос, потому что думаю, что должно быть лучшее решение для реализации такого рода функциональности

1 Ответ

1 голос
/ 12 октября 2011

У вас, очевидно, также есть дата где-то в таблице, иначе вы не сможете бронировать ресурсы. Это приводит к нескольким возможностям.

  1. Запрос времени и даты (может быть сложным, но вы можете сделать это udf для повторного использования)
  2. Использовать DateTime вместо столбцов даты и времени
  3. если в SQL Server рассмотрите возможность создания функции CLR, чтобы справиться с этим, поскольку CLR (код .NET) будет более эффективно определять «находится во временном диапазоне»

Я уверен, что есть и другие возможности. Ключевым моментом здесь является то, что ваш алгоритм не работает в основном из-за событий, которые распространяются на другой день. Если это правильно, приведите день в уравнение - это ваш лучший выбор. Это может закончиться довольно сложным оператором SQL, изменением типов данных (datetime вместо даты и времени) или созданием функции .NET (CLR) для более эффективного определения «находится в диапазоне».

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