Oracle - неправильный результат при использовании sysdate

У меня есть следующий запрос. Этот запрос не возвращает никакого результата:

select snap_id from perfstat.stats$snapshot where snap_time = sysdate;

no rows selected

но если я отформатирую snap_time и sysdate, я получу результат:

select snap_id 
from perfstat.stats$snapshot 
where to_char(snap_time,'dd/mm/yyyy') = to_char(sysdate,'dd/mm/yyyy');

SNAP_ID
----------
         1
         2
         3

Что-то не так с моим запросом? Зачем мне нужно форматировать дату в этом контексте?

obs: столбец snap_time имеет тип даты.


person Harry    schedule 23.11.2019    source источник
comment
CONVERT должен использоваться для других целей (когда речь идет о разных наборах символов), а не для этого (то есть формата даты), @paulsm4.   -  person Littlefoot    schedule 23.11.2019
comment
Причина поведения, которое вы видите, заключается в том, что DATE также имеет часть времени, и поэтому наивная проверка на равенство будет успешной только в том случае, если обе даты совпадают с секундой.   -  person Frank Schmitt    schedule 24.11.2019


Ответы (1)


Предложения where запросов не идентичны.

Первый запрос пытается сопоставить snap_date с текущей датой и временем. Это вряд ли увенчается успехом, если только снимок не был создан в ту же секунду, когда выполняется запрос.

Второй запрос сравнивает часть даты snap_date с текущим днем ​​(часть времени не учитывается).

Этот:

where to_char(snap_time,'dd/mm/yyyy') = to_char(sysdate,'dd/mm/yyyy')

На самом деле означает:

where trunc(snap_time) = trunc(sysdate)

Что можно (и нужно) оптимизировать как более понятное и эффективное:

where snap_time  >= trunc(sysdate)
person GMB    schedule 23.11.2019
comment
Спасибо! Я никогда не забуду об этом! - person Harry; 24.11.2019