Запрос оператора Oracle Set - PullRequest
0 голосов
/ 21 июля 2011

Иметь SQL-запрос в Oracle 11g, который возвращает счет того, существует ли в таблице запись с определенным идентификатором и статусом в диапазоне +/- 15 минут.

Теперь я хочу игнорировать текущую дату, добавив условие типа AND TIMESTAMP < trunc(sysdate).
Однако для случаев, когда запись существует в текущей дате, я хочу игнорировать проверку сравнения дат в запросе '2010-07-20 19:15:11' >= TO_CHAR(TIMESTAMP - (1/1440*15), 'YYYY-MM-DD HH24:MI:SS') AND '2010-07-20 19:15:11' <= (TO_CHAR(TIMESTAMP + (1/1440*15), 'YYYY-MM-DD HH24:MI:SS'))

SELECT count(1) AS COUNT 
FROM MASTER_ONE 
WHERE ID='123' AND STATUS= 'ACTIVE' 
AND '2010-07-20 19:15:11' >= TO_CHAR(TIMESTAMP - (1/1440*15), 'YYYY-MM-DD HH24:MI:SS') 
AND '2010-07-20 19:15:11' <= (TO_CHAR(TIMESTAMP + (1/1440*15), 'YYYY-MM-DD HH24:MI:SS')) 
UNION ALL 
SELECT count(1) AS COUNT 
FROM MASTER_TWO 
WHERE ID='321' AND STATUS= 'ACTIVE' 
AND '2010-07-20 19:15:11' >= TO_CHAR(TIMESTAMP - (1/1440*15), 'YYYY-MM-DD HH24:MI:SS') 
AND '2010-07-20 19:15:11' <= (TO_CHAR(TIMESTAMP + (1/1440*15), 'YYYY-MM-DD HH24:MI:SS'))

Как мне это сделать?

Ответы [ 2 ]

1 голос
/ 21 июля 2011

Хорошо, вы можете попробовать что-то вроде этого, если я вас правильно понял:

SELECT count(1) AS COUNT 
FROM MASTER_ONE 
WHERE ID='123' AND STATUS= 'ACTIVE' 
AND (timestamp > trunc(sysdate) 
  OR (timestamp < trunc(sysdate) 
  AND timestamp BETWEEN to_date(:yourInputDate,'DD/MM/YYYY HH24:MI:SS') - (1/1440*15) 
                    AND to_date(:yourInputDate,'DD/MM/YYYY HH24:MI:SS') + (1/1440*15)))
UNION ALL
SELECT count(1) AS COUNT 
FROM MASTER_TWO 
WHERE ID='321' AND STATUS= 'ACTIVE' 
AND (timestamp > trunc(sysdate) 
  OR (timestamp < trunc(sysdate) 
  AND timestamp BETWEEN to_date(:yourInputDate,'DD/MM/YYYY HH24:MI:SS') - (1/1440*15) 
                    AND to_date(:yourInputDate,'DD/MM/YYYY HH24:MI:SS') + (1/1440*15)))

В этом выборе вы применяете условие 15 минут только в том случае, если в столбце отметки времени указана дата до sysdate.

1 голос
/ 21 июля 2011

Первая проблема с вашим запросом состоит в том, что вы выполняете сравнение строк на дату.Используйте to_date вместо to_char и позвольте Oracle помочь вам.

SELECT   
    to_date('2010-07-20 19:15:11', 'YYYY-MM-DD HH24:MI:SS') AS orig_date
  , to_date('2010-07-20 19:15:11', 'YYYY-MM-DD HH24:MI:SS') - 1 / 24 / 4 AS fifteen_min_prior
  , to_date('2010-07-20 19:15:11', 'YYYY-MM-DD HH24:MI:SS') + 1 / 24 / 4 AS fifteen_min_after
FROM dual;

Вывод:

ORIG_DATE                 FIFTEEN_MIN_PRIOR         FIFTEEN_MIN_AFTER         
------------------------- ------------------------- ------------------------- 
20-JUL-10 07:15:11 PM     20-JUL-10 07:00:11 PM     20-JUL-10 07:30:11 PM     

Затем используйте эти даты в условии BETWEEN всказуемое.См. Oracle date «Между» Запрос .

Мне не совсем понятно, что вы имеете в виду под «Тем не менее, для случаев, когда запись существует в сегодняшнюю дату, я хочу игнорировать проверку сравнения дат»в запросе. "Вы только что написали, что хотите исключить значения из текущего дня.Либо вы исключаете сегодняшние записи, либо нет.

...