Диапазон дат поиска TSQL

#sql-server #tsql #stored-procedures

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

Вопрос:

У меня есть форма поиска, которая позволяет вам вводить в нее любую информацию, которую вы хотите, и выполнять поиск по этим данным.

Вот как выглядит форма:

введите описание изображения здесь

Моя цель — разрешить им вводить начальную и конечную дату. Однако они могли выбрать только один или другой. В этом случае мне нужна моя хранимая процедура для правильной обработки.

Если конечная дата пуста, конечная дата просто станет сегодняшней датой. Если начальная дата пуста, мы могли бы указать любую дату (например, дату по умолчанию sqls, которая включала бы все.

awardDate Это то поле, в котором выполняется поиск. Если введены обе даты, то это должен быть диапазон between start and end

Ниже приведена моя текущая хранимая процедура:

 SELECT DISTINCT A.[awardID],
    A.[awardDescription],
    convert(varchar,cast(A.[awardValue] as money),1) as awardValue,
    CONVERT (VARCHAR (10), A.[awardDate], 101) AS awardDate,
    CONVERT (VARCHAR (10), A.[timestamp], 101) AS timestamp,
    B.[FirstName]   ' '   B.[LastName] as empName,
    B.[ntid] AS empNTID,
    C.[awardType] as awardTypeName,
    D.[locationName],
    E.[awardStatusName]
FROM   taxTracker AS A
   INNER JOIN
   empTable AS B
   ON A.[employee] = B.[empID]
   INNER JOIN
   taxTrackerAwardTypes AS C
   ON A.[awardType] = C.[awardTypeID]
   INNER JOIN taxTrackerLocations as D
   ON A.[awardLocation] = D.[id]
   INNER JOIN taxTrackerStatuses as E
   ON A.[awardStatus] = E.[awardStatusID]
WHERE  ((A.[employee] IN (SELECT ParamValues.x2.value('empID[1]', 'VARCHAR(60)')
          FROM   @employees.nodes('/employees/employee') AS ParamValues(x2)))
    OR (ISNULL(@awardType, '') <> ''
        AND A.[awardType] LIKE '%'   @awardType   '%')
    OR (ISNULL(@awardStatus, '') <> ''
        AND A.[awardStatus] LIKE '%'   @awardStatus   '%'))
FOR    XML PATH ('details'), TYPE, ELEMENTS, ROOT ('root');
  

Ответ №1:

 where (awarddate >= @startdate or @stardate is null)
and (awarddate <= isnull(@enddate, getdate())
  

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

1. Похоже, все работает, за исключением случаев, когда я указываю только начальную дату, например, за месяц до записи. Он должен начинаться с этой даты, а затем получать что-либо вплоть до текущей даты. Пример: запись равна 2/1/2014, и я ввел 1/1/2014 для своего поиска. Он должен получить что-либо между 1/1/2014 и сегодняшней датой

2. Вы пробовали записывать даты в формате ISO, например 20140101 , 20140102 ? Я быстро сделал эту демонстрацию , чтобы проверить логику, и, похоже, все в порядке.

3. Я получил эту ошибку, однако ни одно из полей даты не является INT — Operand type clash: int is incompatible with date

4. В конце концов, это сработало, моя конечная дата отображалась как пустая строка, а не null. Я добавил это в свои переменные NULLIF(@awardStartDate, '')

Ответ №2:

 Awarddate between isnull (@startdate, '19000101') and isnull (@enddate, getdate ())
  

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

1. getdate() трюк может сработать в этом примере, но он не будет работать в случаях с будущими датами расписания, а жестко заданный ‘19000101’ также не подходит в некоторых сценариях.

2. В этом случае вы можете использовать максимальную дату вашего будущего расписания

3. Смотрите Ответ выше от пользователя TI, это общий ответ. И добро пожаловать в SO.