SQL: получить записи, созданные во временном диапазоне для определенных дат - PullRequest
10 голосов
/ 05 марта 2012

У меня есть набор записей, которые были созданы на прошлой неделе, и из тех, которые я хочу извлечь только те, которые были созданы между 6:45 и 19: 15.У меня есть столбец creation_date, который я могу использовать.

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

Ответы [ 3 ]

15 голосов
/ 05 марта 2012

В Oracle мы можем превращать даты в числа и применять к ним арифметику различными способами.

Например, sysdate-7 дает нам дату семь дней назад. trunc(some_date) удаляет элемент времени из столбца даты. И to_char(some_date, 'SSSSS') дает нам свой элемент времени в виде количества секунд с полуночи. Таким образом, 06:45:00 - это 24300 секунд, а 18:15:59 - 69359 секунд (пожалуйста, проверьте эти цифры, так как они находятся на обороте конверта).

В любом случае, собрав все это в один запрос, как этот ...

select *
from your_table
where creation_date >= trunc(sysdate)-7
and to_number(to_char(creation_date, 'sssss')) between 24300 and 69359

... создаст все записи, созданные за последнюю неделю, с элементом времени в основных часах.

3 голосов
/ 05 марта 2012

Этот запрос вернет все записи, созданные за последние 7 дней, с временной частью их даты создания между 6:45 и 7:15 вечера.

select * 
  from your_table
 where creation_date > sysdate - 7
   and to_char(creation_date, 'hh24:mi:ss') >= '06:45:00' 
   and to_char(creation_date, 'hh24:mi:ss') <= '19:15:00' 
0 голосов
/ 05 марта 2012

На основании вышеуказанных критериев будут возвращены записи за последнюю неделю между воскресеньем и субботой в часы с 06:45:00 и 19: 15: 59.

Вы можете настроить «- 7» и «+ 6» на разные числа, если вы хотите, чтобы диапазон недели был другим (например, если ваша неделя с понедельника по воскресенье).

select * 
from your_table
where creation_date >= TRUNC(SYSDATE, 'WW') - 7
and creation_date <= (TRUNC(SYSDATE, 'WW') - 7) + 6
and to_char(creation_date, 'hh24:mi:ss') >= '06:45:00' 
and to_char(creation_date, 'hh24:mi:ss') <= '19:15:00'
...