#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. @Вероятно, это как-то связано с тем, что в этом случае всегда отображается самый длинный формат из возможных вариантов.