Как использовать предложение Between в запросе Sql без использования предложения и

Я создал запрос, который получает результаты между двумя датами, он работает нормально .. Теперь у меня есть сценарий, в котором пользователи не вводят дату .. В этом случае мне нужно получить все результаты из базы данных независимо от даты .. следующий запрос не выполняется, когда пользователь не вводит дату, он возвращает пустой набор результатов.
Пожалуйста, подскажите, как решить эту проблему.

select * from emp_register
where date between ' 2015-03-26 15:42:52' and ' 2015-03-26 15:42:52' 
or status= 'Y'

Формат даты: Timestamp


person dev90    schedule 29.06.2015    source источник
comment
MySQL или sqlserver? А какой тип данных для date?   -  person Abhik Chakraborty    schedule 29.06.2015
comment
У меня есть сценарий, в котором пользователи не вводят дату. Работает ли он с другим языком, кроме MySQL?   -  person Anwar    schedule 29.06.2015
comment
формат даты - отметки времени .. Я отредактировал свой вопрос   -  person dev90    schedule 29.06.2015


Ответы (2)


Есть несколько вариантов:

  1. Использование динамического SQL для построения запросов на основе пользовательского ввода
  2. Использование нескольких операторов IF / ELSE для построения вашего запроса на основе пользовательского ввода
  3. Установка значений по умолчанию для дат начала и окончания, которые всегда будут соответствовать вашему временному диапазону, например 1900-01-01 и 2300-01-01, если пользователь их не пропустил.
person Evaldas Buinauskas    schedule 29.06.2015
comment
Спасибо, я бы выбрал 3-й вариант :) - person dev90; 29.06.2015
comment
Наверное, это самый простой и удобный для чтения. Однако я лично считаю, что второй вариант будет работать лучше (по моему собственному опыту), особенно если ваши данные быстро растут. Сообщите мне, работает ли это для вас. :) - person Evaldas Buinauskas; 29.06.2015
comment
конечно, дам знать .. Спасибо :) - person dev90; 29.06.2015
comment
Нет необходимости использовать PL / SQL, сделайте это в SQL, используя NVL. - person Lalit Kumar B; 29.06.2015
comment
@LalitKumarB Верно. Вы можете использовать NVL для замены значений NULL или определения параметров по умолчанию в описании процедуры, например PROCEDURE P1 (Param1 IN NUMBER := 100); Таким образом, это либо ввод пользователя, либо значение по умолчанию. Я думаю, это зависит от личного вкуса и / или стандартов SQL в вашей компании. - person Evaldas Buinauskas; 29.06.2015
comment
ОП @EvaldasBuinauskas заявил, что он использует запрос, что означает, что он делает это на чистом SQL, а не на PL / SQL (то есть в любом пакете / процедуре). - person Lalit Kumar B; 29.06.2015

где дата между "2015-03-26 15:42:52" и "2015-03-26 15:42:52"

' 2015-03-26 15:42:52' - НЕ ДАТА, это строка. Никогда не полагайтесь на неявное преобразование типов данных. Возможно, вам просто повезет получить результат в зависимости от ваших настроек NLS, однако он определенно не удастся, если настройки NLS клиента будут другими для других.

Теперь у меня есть сценарий, в котором пользователи не вводят дату ... В этом случае мне нужно получить все результаты из базы данных независимо от даты

Не нужно делать это в PL / SQL, делайте это в SQL.

Используйте функцию NVL для значений. Используйте значения даты по умолчанию нижнюю границу и верхнюю границу в предложении BETWEEN для NVL.

Например,

SELECT *
FROM emp_register
WHERE DATE BETWEEN NVL(:date1, DATE '1900-01-01') AND NVL(:date2, DATE '9999-01-01')
OR status= 'Y'

Таким образом, всякий раз, когда :date1 и / или :date2 и / равно NULL, он будет использовать значения даты по умолчанию для выборки всех строк из таблицы.

person Lalit Kumar B    schedule 29.06.2015