Сравнить ДАТУ SQL с ЧИСЛОМ

#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( ? )