Разница дат = 0 в где пункт Oracle? - PullRequest
0 голосов
/ 02 декабря 2018

У меня та же проблема, что и this .Разница лишь в том, что я использую Oracle.Я хочу выбрать строки, которые имеют insertion_date='20.11.2018'.Таким образом, мой запрос был

select * from table where insertion_date='20.11.2018'

. В этом вопросе они предложили datediff, поэтому я посмотрел на его эквивалент в оракуле и узнал, что могу делать арифметику дат.Итак, я попробовал что-то вроде этого:

select * from table where insertion_date -'20.11.2018'=0; 

Это дало ora-00932 inconsistent datatypes expected date got number.

Итак, я попытался;

select * from table where insertion_date - to_date('20.11.2018', 'dd.MM.YYYY') = 0;

Это не дает ошибки, но такжене отображаются результаты, которые, я знаю, должны быть.Что я здесь не так делаю?Спасибо.

Обновление: Извините, я забыл упомянуть, что insertion_date имеет тип date.Но в нем также есть информация о времени (часах, минутах, секундах).

1 Ответ

0 голосов
/ 02 декабря 2018

Что такое тип данных INSERTION_DATE?

Если это DATE, то сравнение его с другой датой (примечание: это литерал даты; используемое вами значение - строка!)

select * from table where insertion_date = date '2018-11-20'

может работать, если только INSERTION_DATE содержит компонент времени (часы и минуты).Затем самый простой вариант - обрезать его значение (чтобы вы могли получить саму дату в полночь):

select * from table where trunc(insertion_date) = date '2018-11-20'

, но это будет разорить индекс, указанный в этом столбце (если толькоэто функциональный).Для небольших столов это не имеет никакого значения.Для большого объема данных он будет преобразован в

select * from table where insertion_date >= date '2018-11-20'
                      and insertion_date <  date '2018-11-21'

Если, с другой стороны, INSERTION_DATE является строковым (VARCHAR2 или CHAR) типом данных (что очень плохоидея; рассмотрите возможность переключения на DATE тип данных), затем вам нужно знать его формат, сначала преобразовать его в DATE, а затем сравнить с другой датой.Например, если это была строка, содержащая значения даты в формате dd.mm.yyyy, то

select * from table where to_date(insertion_date, 'dd.mm.yyyy') = date '2018-11-20'

Это, безусловно, завершится ошибкой, если какая-либо строка в этом столбце не соответствует такому формату или содержит недопустимые значения (такие как «дата» (53.67 (48x48)).

...