2012-06-24 4 views
2

У меня действительно возникли проблемы с попыткой выяснить, как найти определенные записи за последние 12 часов, используя ORACLE. Я хочу, чтобы добавить проверку времени в конце следующих утверждений:Найти записи оракулов за последние 12 часов

SELECT ND_TICKET.TICKET_ID, ND_TICKET.PRIORITY, ND_TICKET.PROBLEM_SUMMARY 
    FROM ARADMIN.ND_TICKET 
     INNER JOIN SUPPORT_AREA 
       ON (ND_TICKET.SUPPORT_AREA_ID = SUPPORT_AREA.SUPPORT_AREA_ID) 
WHERE REGEXP_LIKE(SUPPORT_AREA.SUPPORT_AREA_NAME,'National\s+Technical') 
    AND ND_TICKET.PRIORITY IN(0, 1) 

Я смотрел довольно много места, но ни один из них на самом деле не имеет никакого смысла для меня.

У меня есть столбец с именем TTR_START, который хранит число секунд с 1 января 1970 года (то есть время Unix), которое я хочу использовать для сравнения этой даты.

+0

есть любой столбец, где вы храните дату ввода? – Sebas

+0

@Sebas - дата хранится в TTR_START, которая находится в эпоху. – jmg0880

+0

Нет данных Тип "epoch time" в Oracle –

ответ

4

Если ttr_start это число, которое является время Unix (в секундах с 1 января 1970 года),

AND date '1970-01-01' + nutodsinterval(ttr_start, 'SECOND') >= 
     sysdate - interval '12' hour 

должен работать.

Если индекс на ttr_date это, вероятно, будет более эффективным, чтобы пойти другим путем и преобразовать дату 12 часов назад в число

AND ttr_start >= ((sysdate - interval '12' hour) - date '1970-01-01')*24*60*60 

Вместо того, чтобы внедрить эти вычисления в каждом SQL заявление, Я бы предположил, что вы хотите определить некоторые функции утилиты для преобразования между фактическими датами и вашими числовыми данными. Что-то вроде

CREATE FUNCTION epoch_to_date(p_epoch_num IN NUMBER) 
    RETURN DATE 
IS 
    l_dt DATE; 
BEGIN 
    l_dt := date '1970-01-01' + numtodsinterval(p_epoch_num, 'SECOND'); 
    RETURN l_dt; 
END; 

CREATE FUNCTION date_to_epoch(p_dt IN DATE) 
    RETURN NUMBER 
IS 
    l_epoch_num NUMBER; 
BEGIN 
    l_epoch_num := (p_dt - date '1970-01-01')*24*60*60; 
    RETURN l_epoch_num; 
END; 

Тогда ваши запросы могут быть

AND epoch_to_date(ttr_start) >= sysdate - interval '12' hour 

или

AND ttr_start >= date_to_epoch(sysdate - interval '12' hour) 
+0

Пробовал и получил следующую ошибку. '17:54:13 [SELECT - 0 row (s), 0.000 secs] [Код ошибки: 932, SQL State: 42000] ORA-00932: непоследовательные типы данных: ожидаемый NUMBER получил DATE' Это из-за эпохи времени и в режиме реального времени в SYSDATE? – jmg0880

+0

@ jmg0880 - Пропустил факт в ваших комментариях, что вы храните дату в типе данных «NUMBER». Вы не указываете, какую эпоху вы используете, поэтому я догадался, что вы имеете в виду, что используете эпоху Unix, и вы сохраняете количество секунд с 1 января 1970 года. –

+0

СПАСИБО ВАМ ТАК МНОГО ЮСТИНА !! Это сработало отлично! Ты обалденный. – jmg0880

Смежные вопросы