Почему предложение where сравнивает дату и временную метку иначе, чем предложение case-when?

#date #timestamp #oracle-sqldeveloper #where #case-when

#Дата #временная метка #oracle-sqldeveloper #where-предложение #случай-когда

Вопрос:

Условие в предложении when, содержащее сравнение временной МЕТКИ и ее версии trunc(), по-видимому, оценивается иначе, чем когда оно находится в предложении where .

Я работаю в Oracle SQL developers. У меня есть таблица с атрибутом timestamp(6). Мне сказали, что атрибут timestamp имеет измерение времени, всегда пустое (00:00:00,000000). Я хотел проверить это, и я столкнулся с интересной проблемой. Когда я использую предложение where

 Select * from CUSTOMER_DATA 
where trunc(DAT_CUSTOMER_SINCE) <> DAT_CUSTOMER_SINCE
  

Я действительно получаю нулевые строки.

Но когда я хочу видеть атрибуты как усеченные, я использую предложение Case-when

 CASE WHEN trunc(DAT_CUSTOMER_SINCE) = DAT_CUSTOMER_SINCE then
          trunc(DAT_CUSTOMER_SINCE) 
     else DAT_CUSTOMER_SINCE 
end 
from CUSTOMER_DATA
  

Я получаю вывод в виде метки времени, т. Е. Как если бы условие было ложным.

Вот пример таблицы / данных:

    create table CUSTOMER_DATA(
DAT_CUSTOMER_SINCE TIMESTAMP(6),
Another_text VARCHAR2(50 CHAR)
)
--select * from customer_data;
Insert into customer_data values(TO_TIMESTAMP('2019-04-15 00:00:00,000000', 'YYYY-MM-DD HH24:MI:SS,FF6'),'Not important');
select
CASE WHEN trunc(DAT_CUSTOMER_SINCE) = DAT_CUSTOMER_SINCE then
          trunc(DAT_CUSTOMER_SINCE) 
     else DAT_CUSTOMER_SINCE 
end 
from CUSTOMER_DATA;
select trunc(DAT_CUSTOMER_SINCE) from customer_data
where DAT_CUSTOMER_SINCE=trunc(DAT_CUSTOMER_SINCE);
  

Мой вопрос в том, почему это сравнение работает в предложении where, но не работает в предложении Case-when ?

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

1. Не могли бы вы предоставить CREATE TABLE и ВСТАВИТЬ В образец данных, пожалуйста?

2. Я не уверен, что вы пришли к правильному выводу, DAT_CUSTOMER_SINCE может казаться усеченным из-за формата даты в вашем инструменте SQL (SQL developer в вашем примере). Если у вас нет точности «hh: mi: ss» в нем trunc(dat_customer_since) и dat_customer_since даст вам тот же отображаемый результат. Вы можете использовать, например ALTER SESSION SET NLS_DATE_FORMAT='DD/MM/YYYY HH24:MI:SS' , для его изменения

3. @Littlefoot Я добавил некоторый образец, как вы просили, проблема присутствует и в этом примере, хотя исходные данные я не могу раскрыть. R.Du проблема в том, как вы можете видеть в добавленном коде, что когда я выбираю trunc(timestamp) напрямую (вне того, чтобы быть частью инструкции case)я получаю только часть даты, но когда она находится в операторе case как часть, которая должна быть оценена, я получаю всю временную метку. Возможно, что результат оператора case может быть только в одном формате, и, следовательно, выбирается более длинная из 2 ветвей оператора case…

4. Спасибо, Йозеф. Все, что я могу сказать, это то, что полученный результат соответствует тому, что вы сказали, но я не знаю причины.

5. @Вероятно, это как-то связано с тем, что в этом случае всегда отображается самый длинный формат из возможных вариантов.