2015-06-04 2 views
0

У меня есть этот код работать:Oracle метки времени и текущая_дат

ixdtl.timestamp between 
to_date('2015/06/03', 'YYYY/MM/DD')+ INTERVAL '03:0:0.0' HOUR TO SECOND 
    AND to_date('2015/06/03', 'YYYY/MM/DD')+ INTERVAL '1 2:59:59.99' DAY TO SECOND 
    AND 
    (
    icrun.RUNDATE BETWEEN to_date('2015/06/03', 'YYYY/MM/DD') 
    AND to_date('2015/06/03', 'YYYY/MM/DD')+ INTERVAL '1' DAY 
    ) 

Но теперь, вместо строки «2015/06/03», мне нужно использовать переменную CURRENT_DATE так, что ixdtl.timestamp между 3AM вчера и сегодня 3AM. Кроме того, реванш должен быть вчера или сегодня.

Как я могу это сделать?

ответ

2

CURRENT_DATE - текущая дата и время. Если вы хотите только часть даты, используйте функцию TRUNC.

Чтобы получить 3am вчера и 3 утра сегодня, это, вероятно, проще вычесть 21 часов от сегодня в полночь на 3 часа ночи вчера, добавить 3 часа сегодня в полночь 3 утра сегодня, и использовать> =/< вместо BETWEEN

ixdtl.timestamp >= TRUNC(CURRENT_DATE) - INTERVAL '21' HOUR AND 
ixdtl.timestamp < TRUNC(CURRENT_DATE) + INTERVAL '3' HOUR 

На сегодня и вчера найдите> = один день назад и < завтра.

ixdtl.RUNDATE >= TRUNC(CURRENT_DATE) - INTERVAL '1' DAY AND 
ixdtl.RUNDATE < TRUNC(CURRENT_DATE) + INTERVAL '1' DAY 

Поместите их все вместе, и вы получите:

WHERE ixdtl.timestamp >= TRUNC(CURRENT_DATE) - INTERVAL '21' HOUR 
    AND ixdtl.timestamp < TRUNC(CURRENT_DATE) + INTERVAL '3' HOUR 
    AND ixdtl.RUNDATE >= TRUNC(CURRENT_DATE) - INTERVAL '1' DAY 
    AND ixdtl.RUNDATE < TRUNC(CURRENT_DATE) + INTERVAL '1' DAY 
+0

прекрасно работает! –

1

Ваш сказуемое следует читать:

ixdtl.timestamp 
    BETWEEN trunc(CURRENT_DATE) - INTERVAL '21' HOUR 
    AND  trunc(CURRENT_DATE) + INTERVAL '3' HOUR 
+0

Также работает красиво! –

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