Oracle BI: выбрать все записи за последнюю неделю - PullRequest
0 голосов
/ 19 апреля 2011

Мне нужно получить все записи с датой между воскресеньем и субботой на прошлой неделе, включительно, на любую дату выполнения запроса. На сегодня, 19 апреля 2011 года, это будет с 10 по 16 апреля.

Когда я ввел даты вручную и преобразовал фильтр в SQL, я получил следующий синтаксис:

RESOLVED_DATE BETWEEN timestamp '2011-04-10 00:00:00' AND timestamp '2011-04-16 00:00:00'

Я даже не уверен, что это правильно, потому что кажется, что оно исключает даты 16го числа (не должно ли быть время 23:59:59?)

Ответы [ 2 ]

2 голосов
/ 20 апреля 2011

Можно определить нужные даты, используя комбинации следующий_день и арифметику обычной даты. Приведенный ниже код должен быть довольно близок, но он не проверен и, возможно, завершится неудачно в некотором угловом случае, но по крайней мере вы получите общее представление:)

where resolved_date >= next_day( trunc(sysdate) - interval '14' day, 'SUN')
  and resolved_date <  next_day( trunc(sysdate) - interval '7'  day, 'SUN')

trunc(sysdate) усекать дату до дня; 2011-04-19 23:32:34 становится 2011-04-19 00:00:00, т.е. удаляя компонент времени. next_day(sysdate, 'SUN') возвращает следующее воскресенье. Если sysdate случается в воскресенье, возвращается следующее воскресенье.
Важно : названия дней должны быть на том же языке, что и ваша сессия.
interval - это просто стандартный способ сложения / вычитания различных единиц времени из даты.

Если сложить все вместе, логика для 19 апреля 2011 года будет такой:

  1. Сокращение sysdate => 2011-04-19 00: 00: 00
  2. вычесть 14 дней => 2011-04-05 00: 00: 00
  3. Найти следующее воскресенье => 2011-04-10 00: 00: 00

... и

  1. Сокращение sysdate => 2011-04-19 00: 00: 00
  2. вычесть 7 дней => 2011-04-12 00: 00: 00
  3. Найти следующее воскресенье => 2011-04-17 00: 00: 00

.. в результате получается следующий запрос:

 where resolved_date >= timestamp '2011-04-10 00:00:00'
   and resolved_date <  timestamp '2011-04-17 00:00:00'

Будут включены все resolved_dates, которые произошли в первую секунду 10-го числа или после этой даты, но до первой секунды 17-го числа. Обратите внимание, что >= и < не эквивалентны between.

Замечание по производительности: я бы позаботился о том, чтобы Oracle правильно оценил диапазон дат в 7 дней и чтобы использовался правильный порядок / метод соединения. Если вы ожидаете, что запрос будет выполняться какое-то время, вы можете позволить себе вычислять даты в приложении и указывать их как даты, а не вычислять их на лету, как я делал выше.

0 голосов
/ 19 апреля 2011

взгляните на функцию to_date: http://psoug.org/reference/builtin_functions.html

...