#sql #oracle #ora-00932
#sql #Oracle #ora-00932
Вопрос:
Я работаю со следующей инструкцией SQL и, похоже, не могу получить правильный синтаксис:
idSelectQuery=Select "numberprgn"
from "SMT1"."CM3R1M1"
where "category" != 'KM Document'
AND ("sysmodtime" - TO_DATE('1970-01-01', 'YYYY-MM-DD')) * 86400000 > ?
Где ‘?’ — это текущее системное время в виде числа, которое на самом деле является эпохальным временем.
Этот оператор завершается ошибкой из-за:
ORA-00932: несовместимые типы данных: ожидаемое ЧИСЛО, полученное ДАТОЙ
Мне нужно иметь возможность сравнивать sysmodtime с? значение времени, хотя я не могу понять, как правильно это сделать… Я не уверен, смогу ли я преобразовать sysmodtime в char, а затем в number, потому что я знаю, что невозможно напрямую преобразовать date в number.
У кого-нибудь есть предложения, как заставить это работать?
Спасибо
Комментарии:
1. Каков тип данных «sysmodtime»? Oracle ожидает там дату.
Ответ №1:
Я подозреваю, что вы хотите
"sysmodtime" > TO_DATE('1970-01-01', 'YYYY-MM-DD') (?/ 86400000)
Предполагая, что? представляет количество миллисекунд с 1 января 1970 года. Написание запроса таким образом позволяет использовать индекс в «sysmodtime».
Теперь, на самом деле, вы, вероятно, захотите создать функцию, которая принимает числовое время и преобразует его в дату, т.Е.
CREATE FUNCTION epoch_to_date( p_epoch IN NUMBER )
RETURN DATE
IS
BEGIN
RETURN TO_DATE('1970-01-01', 'YYYY-MM-DD') (p_epoch/ 86400000);
END;
которую вы можете вызвать в своем запросе
"sysmodtime" > epoch_to_date( ? )