Добавить предложение Where для выбора записей только в пределах определенного диапазона дат

#sql #sql-server #date #datetime #stored-procedures

#sql #sql-сервер #Дата #дата-время #хранимые процедуры

Вопрос:

У меня есть таблица со столбцом « dateRec «, отформатированным как datetime, и процедура выбора для извлечения данных из этой таблицы. Процедура имеет два входных параметра, rangeStart rangeEnd которые могут быть отформатированы либо как datetime, либо как nvarchar (что имеет смысл здесь).

Как я могу добиться того, чтобы я выбирал только записи, где dateRec находится между RangeStart и RangeEnd ?

Моя процедура (сокращенная) — просто для демонстрации того, что я ищу:

 ALTER PROCEDURE [dbo].[FetchRequests]
    @rangeStart datetime,
    @rangeEnd datetime
AS
BEGIN
    SET NOCOUNT ON;

    SELECT      logID,
                flag,
                reviewer,
                dateRec
    FROM        LogRequests
    WHERE       dateRec >= rangeStart
    AND         dateRec <= rangeEnd
    FOR XML PATH('requests'), ELEMENTS, TYPE, ROOT('ranks')
END
  

Большое спасибо за любую помощь в этом, Майк.

Комментарии:

1. что в этом плохого?

2. как говорит @Nithesh, есть ли ошибки в этом или это просто проверка кода?

3. Поскольку параметр datetime , если вы передаете NVARCHAR, он будет преобразован в datetime до запуска процедуры . Итак, в принципе, что не так с вашим существующим кодом?

4. @Mike Вы неправильно использовали переменные, вам нужно добавить знак @. Пожалуйста, смотрите Мой ответ ниже.

5. Спасибо — так это действительно правильно? Я не ожидал, что смогу выбрать даты таким образом.

Ответ №1:

Вы можете использовать ключевое слово BETWEEN:

 ALTER PROCEDURE [dbo].[FetchRequests]
    @rangeStart datetime,
    @rangeEnd datetime
AS
BEGIN
    SET NOCOUNT ON;

    SELECT      logID,
                flag,
                reviewer,
                dateRec
    FROM        LogRequests
    WHERE       dateRec BETWEEN @rangeStart AND @rangeEnd
    FOR XML PATH('requests'), ELEMENTS, TYPE, ROOT('ranks')
END
  

Комментарии:

1. Спасибо за это! Будет ли это включать дату начала диапазона и дату окончания диапазона? Кроме того, в каком формате мне нужно будет передать параметры для этой процедуры? Будет ли работать что-то вроде 2014-01-31 или входные данные должны быть в определенном формате?

2. Yes BETWEEN возвращает TRUE, если значение test_expression больше или равно значению begin_expression и меньше или равно значению end_expression .

3. Большое спасибо — это здорово!

4. Я рад, что смог помочь.

5. Используйте функцию SELECT GETDATE(), чтобы определить формат даты и времени по умолчанию, настроенный для сервера.