Oracle: относительная дата и таблица с секционированной датой - PullRequest
2 голосов
/ 27 марта 2020

У меня есть разделенная на месяц таблица в Oracle по столбцу DATETIME. Эта таблица содержит> 6 миллиардов строк. Теперь я хочу отфильтровать эту таблицу, используя sysdate. Таким образом, я могу писать запросы, используя относительную дату, как, например, вчера, в последний день недели, в прошлом году и т. Д. c ...

Итак, я ищу что-то вроде приведенного ниже кода, который работает:

SELECT *
FROM BIG_PART_TABLE PARTITION FOR (DATE **TODAY**)
WHERE TRUNC(DATETIMECOLUMN) = TRUNC(SYSDATE)

Но, очевидно, это не сработает.

У вас есть какие-нибудь идеи, чтобы я мог заставить их работать?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 27 марта 2020

Вы не можете точно сказать, в какой раздел Oracle нужно смотреть, так как sysdate является энергозависимой функцией (ie ее значение не является постоянным во времени). Вместо того, чтобы писать сложный динамический c код для этого, вам, вероятно, следует в первую очередь доверить базе данных выбор правильного раздела.

Я сформулирую ваш запрос следующим образом:

select *
from big_part_table partition 
where datetimecolumn >= trunc(sysdate) and datetimecolumn < trunc(sysdate) + 1

Условие where функционально эквивалентно вашему исходному условию, и оно дает базе данных разумную возможность оценить, какой раздел следует использовать.

1 голос
/ 27 марта 2020

Используйте ранжированное сравнение:

SELECT *
  FROM BIG_PART_TABLE
  WHERE DATETIMECOLUMN BETWEEN TRUNC(SYSDATE)
                           AND TRUNC(SYSDATE+1)

Это шаблон, который полезен при поиске индексированных значений даты.

...