Вычитание n дней из даты с использованием SQL - PullRequest
4 голосов
/ 07 сентября 2011

Я довольно новичок в том, что касается Oracle. У меня проблемы с выяснением, как сделать что-то похожее на это:

SELECT ID, NAME, TO_CHAR(DATEBIRTH, 'DD/MM/YYYY HH24:MI:SS') 
FROM PEOPLE WHERE DATEBIRTH >= ANOTHERDATE - NDAY

Короче говоря, я хочу выбрать всех, кто родился за N дней до определенной даты и времени, но я не совсем уверен, что это способ сделать это или что он даст мне ожидаемые результаты.

PS: я развиваюсь под oracle8i.

Ответы [ 4 ]

4 голосов
/ 07 сентября 2011

Ваш запрос выглядит правильно для меня. Вот так вы вычитаете дни из дат в Oracle. Эта ссылка содержит некоторые дополнительные сведения, если вы хотите добавить месяцы или годы:

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1157035034361

3 голосов
/ 07 сентября 2011

Возможно, вы захотите считать временную часть вашей даты «ANOTHERDATE».

Если вас интересуют только целые дни, вы можете переписать свой запрос следующим образом:

SELECT ID, NAME, TO_CHAR(DATEBIRTH, 'DD/MM/YYYY HH24:MI:SS')
  FROM PEOPLE 
 WHERE DATEBIRTH >= TRUNC(ANOTHERDATE - NDAY)

NBПредполагается, что «NDAY» является числовым.

«Короче говоря, я хочу выбрать всех, кто родился за N дней до определенной даты и времени, но я не совсем уверен, что это способне делайте этого и не дайте мне ожидаемых результатов. "

Мой первый запрос даст вам всех с днем ​​рождения ПО ИЛИ ПОСЛЕ " NDAY "дней до" ДРУГОЙ ДАТЫ ".*

Это даст вам всех, у кого день рождения ON день, который "NDAY" дней до "ANOTHERDATE":

SELECT id,
       name,
       TO_CHAR(datebirth, 'DD/MM/YYYY HH24:MI:SS') AS birth_date
  FROM people
 WHERE TRUNC(datebirth) = TRUNC(anotherdate - NDAY);

Если есть индекс на "столбец datebirth ", то вы не хотите оборачивать его TRUNC, чтобы вы могли использовать следующее, которое могло бы использовать любой индекс для" datebirth ":

SELECT id,
       name,
       TO_CHAR(datebirth, 'DD/MM/YYYY HH24:MI:SS') AS birth_date
  FROM people
 WHERE datebirth >= TRUNC(anotherdate - NDAY)
   AND datebirth < (TRUNC(anotherdate - NDAY) + 1);
0 голосов
/ 31 августа 2016

Ниже запроса вычтите n дней от указанной даты

select to_date('date') - 'n days' 
from dual 

пример:

select TO_DATE('02-Jul-16') - 90 
from dual
0 голосов
/ 14 мая 2014

Вы должны явно конвертировать (anotherdate) в дату, затем вычесть (ndays) из нее:

SELECT ID, NAME, TO_CHAR(DATEBIRTH, 'DD/MM/YYYY HH24:MI:SS')
  FROM PEOPLE 
 WHERE DATEBIRTH >= TO_DATE(ANOTHERDATE) - NDAY
...